虚拟功能怀疑

时间:2017-02-12 05:40:12

标签: c++ class inheritance virtual-functions

我有这个简单的代码来测试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并执行它吗?

1 个答案:

答案 0 :(得分:1)

当一个函数在类Base中是虚拟的时,它在所有派生类中都是虚拟的,从派生类派生的类等等,不管派生类中是否使用了单词virtual类。

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

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