我有这个简单的代码来测试VF
class A
{
public:
virtual const char Get (){return 'A';}
};
class B : public A
{
public:
const char Get (){return 'B';}
};
class C : public B
{
public:
const char Get (){return 'C';}
};
class D : public C
{
public:
const char Get (){return 'D';}
};
在main()
中D dD;
std::cout<<dD.Get()<<std::endl; //prints D
A & rA = dD;
std::cout<<rA.Get()<<std::endl;//prints D
C cC;
A & rA2 = cC;
std::cout<<rA2.Get()<<std::endl; //print C
B & rB = dD;
std::cout<<rB.Get()<<std::endl;
/*????? it prints D, shouldn't it print B ?????*/
rB指向地址dD,rB仅指dD对象的对象(B和A)(不会看到C&amp; D)。
当调用rB.Get()时,它不应该转到B中最大的派生函数,而不是A并执行它吗?
答案 0 :(得分:1)
当一个函数在类Base
中是虚拟的时,它在所有派生类中都是虚拟的,从派生类派生的类等等,不管派生类中是否使用了单词virtual
类。
在您的情况下,这意味着Get
在您的所有课程A
,B
,C
和D
中都是虚拟的。因此,案例rA
和rB
就是同一种情况的例子。
返回类型可能略有不同:作为返回类型的原始引用或指针可以专门用于派生类。因为它的特异性在与包含类相同的方向上变化,所以它被称为协变返回类型。但是,C ++不支持参数的变化。