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。
答案 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。