【发布时间】:2017-02-12 05:40:12
【问题描述】:
我有这个简单的代码来测试 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&D)。
当rB.Get()被调用时,它不应该去B中而不是A中的最衍生函数并执行它吗?
【问题讨论】:
-
为什么你认为派生最多的对象在B中? rB 是对 B 的引用,但派生最多的是 D。请参阅:en.cppreference.com/w/cpp/language/virtual
-
如果我错了请纠正我,但我认为在 rB 的情况下它指的是对象 dD 的 A&B 部分,并且在调用 rB.Get() 的上下文中,编译器将看A&B中派生最多的Get()就是B::Get()
-
@Adam:是的,你错了。
rB是对D对象的引用。virtual函数的全部意义在于静态类型可以是基类,而动态类型是派生的,对于virtual函数,调用最派生的动态类型的版本。 -
- 如果 A::Get () 不是虚拟的 - `std::cout
-
也许你对 B、C 和 D 中的 Get() 方法中缺少
virtual感到困惑。它们都是虚拟的。将它们标记为虚拟与否没有区别,因为它们的虚拟性是由基类设置的。
标签: c++ class inheritance virtual-functions