[问题] 多重继承盲点请教

楼主: dreamboat66 (小嫩)   2017-10-06 01:11:32
以下是我的测试程式
https://ideone.com/B9vCuB
这是main函数 想逐步询问一些观念是否有误
int main() {
C* ptr = new C;
cout << "((A*)ptr):" << ((A*)ptr) << endl;
// 这边会有一个sizeof(void*)的offset差距是因为 C中其实含有A::和B::vptr
// 他必须shift一个offset到&B::vptr?
cout << "((B*)ptr):" << ((B*)ptr) << endl;
ptr->A::Test(1);
// 这边我指定B:: 所以她也是要从 "&B::vptr" 开始, 所以this 有shift offset?
ptr->B::Test(2.2f);
((A*)ptr)->Test(1);
//这边我不太能理解 他为什么能够把this "退回" 到 ptr 而不是 (B*)ptr?
((B*)ptr)->Test(2.2f);
//刻意转成void*
void* ptrA = ((A*)ptr);
void* ptrB = ((B*)ptr);
((A*)ptrA)->Test(1);
// 我可以解读说 他在B::vptr指向的vtable中找Test 是C::有override
// 所以她知道要"退回"到ptr?
((B*)ptrB)->Test(2.2f);
// 这边故意写错, 是不是就让他去A::vptr里面找错vtable所以Test就走到
// A::Test(int)被C::Test给override的版本?
((B*)ptrA)->Test(2.2f);
// 这边我只是想要确认一下override 两个不相干却同名字的virtual function
// 是不是A::Same跟B::Same同时都会被override 并且也没有写法能够让他们走
// 不同的实作?
// 如果观念没错 是不是 A::vptr 和B::vptr 所指向的vtable里面分别都有
// Same的entry(想确定是不是有两份override)
((A*)ptrA)->Same();
((B*)ptrB)->Same();
((B*)ptrA)->Same();
ptr->Same();
return 0;
}
以上是我自己解读的, 如果有错误, 请各位矫正一下观念
谢谢

Links booklink

Contact Us: admin [ a t ] ucptt.com