虚函数疑惑

Virtual Functions Doubts

本文关键字:疑惑 函数      更新时间:2023-10-16

我有这个简单的代码来测试 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';}
};

内部主 ((

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&D(。

当调用rB.Get((时,它不应该转到B中而不是A中派生最多的函数并执行它吗?

当函数在类中是虚拟的时Base它在所有派生类、派生类派生的类等中都是虚拟的,无论在派生类中使用是否使用单词virtual

在您的情况下,这意味着Get在您的所有类中都是虚拟的,ABCD。因此,rArB的情况都是同一类情况的例子。

返回

类型可以略有不同:作为返回类型的原始引用或指针可以专用于派生类。由于它的特异性与包含类的方向相同,因此称为协变返回类型。但是,C++并不支持参数的方差。