【发布时间】:2014-11-26 16:08:21
【问题描述】:
在给定的示例中,创建了 3 个 VTable,并创建了 3 个 vptr。
但我想会有四个 VTable,其中 3 个用于基类,一个用于派生类,其中包含其派生的基类的所有虚函数地址及其自己的虚函数地址的条目。对象 obj 的大小为 12。这意味着它有 3 个 vptr。但是 vptr 是按对象创建的。这里创建了一个对象,我们怎么有3个vptr。
class Base1
{
virtual void fun1() { cout << "Base1::fun1()" << endl; }
virtual void func1() { cout << "Base1::func1()" << endl; }
};
class Base2 {
virtual void fun1() { cout << "Base2::fun1()" << endl; }
virtual void func1() { cout << "Base2::func1()" << endl; }
};
class Base3 {
virtual void fun1() { cout << "Base3::fun1()" << endl; }
virtual void func1() { cout << "Base3::func1()" << endl; }
};
class Derive : public Base1, public Base2, public Base3
{
public:
virtual void Fn()
{
cout << "Derive::Fn" << endl;
}
virtual void Fnc()
{
cout << "Derive::Fnc" << endl;
}
};
typedef void(*Fun)(void);
int main()
{
Derive obj;
std::cout << "size:" << sizeof(obj) << std::endl;
Fun pFun = NULL;
// calling 1st virtual function of Base1
pFun = (Fun)*((int*)*(int*)((int*)&obj+0)+0);
pFun();
// calling 2nd virtual function of Base1
pFun = (Fun)*((int*)*(int*)((int*)&obj+0)+1);
pFun();
// calling 1st virtual function of Base2
pFun = (Fun)*((int*)*(int*)((int*)&obj+1)+0);
pFun();
// calling 2nd virtual function of Base2
pFun = (Fun)*((int*)*(int*)((int*)&obj+1)+1);
pFun();
// calling 1st virtual function of Base3
pFun = (Fun)*((int*)*(int*)((int*)&obj+2)+0);
pFun();
// calling 2nd virtual function of Base3
pFun = (Fun)*((int*)*(int*)((int*)&obj+2)+1);
pFun();
// calling 1st virtual function of Drive
pFun = (Fun)*((int*)*(int*)((int*)&obj+0)+2);
pFun();
// calling 2nd virtual function of Drive
pFun = (Fun)*((int*)*(int*)((int*)&obj+0)+3);
pFun();
return 0;
}
在这个示例中,我希望派生类的虚拟指针位于
(int *)*((int *)(&obj)+3)
然而,VPTR 是在
(int *)*((int *)(&obj)+0)
有人可以解释一下吗? 提前致谢!
【问题讨论】:
-
为什么你期待你所期待的?是什么让你有权持有任何期望? (请引用参考资料。)
-
"创建了一个对象,我们如何拥有 3 个 vptr"?该对象继承自 3 个类。
标签: c++