我认为这可能是一个重复的问题,但我尝试阅读几乎所有相关的帖子,但没有一个是针对我正在寻找的内容。
好的,所以我理解你不能从基类指针调用派生类中的函数,除非它被标记为虚拟。与参考程序1一样,如果WhichClass()未标记为虚拟,则无法调用B类'WhichClass()。
#include<iostream>
using namespace std;
class A
{
public:
const char* WhichClass(){return "A";}
};
class B:public A
{
public:
const char* WhichClass(){return "B";}
};
int main()
{
B b;
A &a = b;
cout<<"In class "<<a.WhichClass();
return 0;
}
如果我将其标记为虚拟,则它从基类调用派生类最多的函数。现在假设我添加了另一个继承自B的类C(如程序2所示),如果在类B中没有将WhichClass()标记为虚拟,那么基本引用(&amp; a)如何调用WhichClass()函数C级?同样使用B类引用(&amp; b),如果我们在程序1中观察到它甚至没有在B类中标记为虚拟,它如何调用C中的WhichClass()?
#include<iostream>
using namespace std;
class A
{
public:
virtual const char* WhichClass(){return "A";}
};
class B:public A
{
public:
const char* WhichClass(){return "B";}
};
class C:public B
{
public:
const char* WhichClass() { return "C";}
};
int main()
{
C c;
A &a = c;
B &b = c;
cout<<"In class " << a.WhichClass() << endl;
cout<<"In class " << b.WhichClass() << endl;
return 0;
}
答案 0 :(得分:2)
因为当你在一个方法中创建一个虚拟的基类并创建一个指向任何派生类的基类指针时,那么在这种情况下它会调用最派生的类函数。 在你的情况下,你有,
A &a = c;
这里基类A的指针指向类C,所以当你调用WhichClass()方法时,会调用类C的方法。
B &b = c;
即使在这里使用基类指针调用函数时,也会根据您指向的类调用大多数派生类的函数。在这种情况下,类B的指针指向类C的对象,因此将调用类C的WhichClass()方法。 有关详细信息,请查看此polymorphism
答案 1 :(得分:2)