带参数作为类指针的虚函数

Kha*_*lid 2 c++ overriding virtual-functions

class A
{
      public:
             virtual void display_A(A* obja)
             {
                     cout<<"Class A"<<endl;
             }
};
class B:public A
{
      public:
             void display_A(B* objb)
             {
                     cout<<"Class B"<<endl;
             }
};

int main()
{
    A AOBJ;
    B BOBJ;
    A *obja = new B();
    obja->display_A(&AOBJ);
    obja->display_A(&BOBJ);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

A类中有一个虚函数,参数为as A*,我们在derived class Bwith参数中覆盖了相同的函数B*.

我创建了一个指向派生类对象的指针obja(指向类的指针A)B.当我display_Aobja带有参数的指针调用函数作为类A对象指针和类B对象指针时,我得到了o/p as

Class A
Class A
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么我会得到那个o/p.

son*_*yao 5

它没有覆盖,因为参数的类型不一样.

如果某个成员函数vf在类Base中被声明为virtual,并且某个类Derived(直接或间接地从Base派生)具有成员函数的声明,具有相同的成员函数

name
parameter type list (but not the return type)
cv-qualifiers
ref-qualifiers 
Run Code Online (Sandbox Code Playgroud)

然后,Derived类中的此函数也是虚拟的(无论关键字virtual是否在其声明中使用)并覆盖Base :: vf(无论是否在其声明中使用了字覆盖).

使用override说明符可以帮助您在编译时找到错误.

指定虚函数覆盖另一个虚函数.

在成员函数声明或定义中,override确保该函数是虚函数并从基类重写虚函数.如果不是这样,程序格式不正确(生成编译时错误).

class B:public A
{
      public:
             void display_A(B* objb) override
             //                      ^^^^^^^^
             {
                     cout<<"Class B"<<endl;
             }
};
Run Code Online (Sandbox Code Playgroud)