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

时间:2016-03-26 09:56:19

标签: c++

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;
}

A类中有一个虚函数,其参数为A*,我们使用参数class B覆盖派生B*中的相同函数。

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

Class A
Class A

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

2 个答案:

答案 0 :(得分:5)

它不是overriding,因为参数的类型不一样。

  

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

name
parameter type list (but not the return type)
cv-qualifiers
ref-qualifiers 
     

然后Derived类中的这个函数也是虚函数(无论是否为   不是关键字virtual在其声明中使用)和覆盖   Base :: vf(无论是否使用单词覆盖)   声明)。

使用override specifier可以帮助您在编译时找到错误。

  

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

     

在成员函数声明或定义中,override确保该函数是虚函数并覆盖基类中的虚函数。如果不是这样,程序就会形成错误(产生编译时错误)。

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

答案 1 :(得分:0)

当通过A *调用display_A时,调用A或B的虚拟函数或A的非虚函数。由于原型不同,唯一符合此条件的函数是A :: display_A。