[问题] 关于虚拟继承的观念。

楼主: Roy75117 (优酪乳)   2016-07-27 05:21:38
自认为虚拟继承的观念很模糊,通常一多重,自己的答案就很没信心。
希望强者可以给我浅显易懂的理解。
Case 1:
main1跑下来结果d->virt1()没问题应该是150没错,但Global1( d )跑出来的结果为什么不是100?
#include <stdio.h>
class Base1
{
public:
virtual int virt1() { return 100; }
int data1;
};
class Derived : public Base1
{
public:
virtual int virt1() { return 150; }
int derivedData;
};
int Global1( Base1 * b1 )
{
return b1->virt1();
}
main1()
{
Derived * d = new Derived;
printf( "%d %d\n", d->virt1(), Global1( d ));
}
________
Case 2:Main2跑下来的结果,
md->virt1() 应该是150
Global1( md )这个是100还是150自己就没什么信心了。
md->virt2()这个应该也是250
Global2( md )这个应该是250吧?
class Base2
{
public:
virtual int virt2() { return 200; }
int data2;
};
class MultipleDerived : public Base1, public Base2
{
public:
virtual int virt1() { return 150; }
virtual int virt2() { return 250; }
int derivedData;
};
int Global2( Base2 * b2 )
{
return b2->virt2();
}
main2()
{
MultipleDerived * md = new MultipleDerived;
printf( "%d %d %d %d\n",
md->virt1(), Global1( md ), md->virt2(), Global2( md ));
}
作者: steve1012 (steve)   2016-07-27 05:41:00
Based type pointer 会透过virtual table 指到derivedclass virtual function
作者: Sex5F (HTC)   2016-07-27 06:48:00
买本书吧,孩子
作者: SeamusBerloz (轩摩斯)   2016-07-27 09:06:00
光从字面解释,在 Global1 函数范围内把 b1 当作 Base1 来操作,所以呼叫 Global1(d) 回传当然是 Base1的定义结果喽。Global2 自然也是同样的道理。
作者: Frozenmouse (*冰之鼠*)   2016-07-27 18:08:00
楼上说的行为应该是non-virtual才对吧@@virtual 就是像一楼讲的 vtable 查表上去,会先查到子类别的定义
作者: steve1012 (steve)   2016-07-28 02:10:00
继承的类别都有一个virtual table 是一个表格 里面放每个function的位置 所以你call 的时候他会去查表 自然而然就会找到derived class的函数 这样有比较清楚吗

Links booklink

Contact Us: admin [ a t ] ucptt.com