虚函数表实现多重继承
Vtable implementation in multiple inheritance
我无法弄清楚如何为多重继承创建变量的模式。请看下面的代码:
// Iam just providing pseudocode model
class A{
public:
Vptr[]; // create function pointer
virtual void run(){}
A(){
this->Vptr[0] = &A::run; // push virtual function address
}
}
class B{
public:
Vptr[]; // create function pointer
virtual void sleep(){}
B(){
this->Vptr[0] = &B::sleep; // push virtual function address
}
}
class C : public A, public B{
public:
virtual void run(){}
virtual void eat(){}
C(){
this->A::Vptr[0] = &C::run; // update function address since overrided
// the question is onto which Vptr does eat() entry is stored?
// this->A::Vptr[1] = &C::eat() OR this->B::Vptr[1] = &C::eat()
}
}
在单继承级别的情况下,它在最后不断向同一个VPTR
添加虚函数项,但在多重继承中它是如何决定的?因为它有两个Vptrs
我假设你的代码实际上是伪c++。
但是你的代码是错误的,因为在c++中虚值表是每个类的,而不是每个实例的。每个实例保存一个指向其类的虚函数表的指针。
所以它应该是(当然是伪c++);
fn_t A::VTable[] = { &A::run };
fn_t B::VTable[] = { &B::sleep };
fn_t C::VTable[] = { &C::run, &C::eat };
A::A()
{
A::VPtr = A::VTable;
}
B::B()
{
B::VPtr = B::VTable;
}
C::C()
{
A::VPtr = C::VTable;
B::VPtr = B::VTable;
}
可以看到,C
有两个vtable,一个继承自A
,另一个继承自B
。第一个扩展了C
的所有新的虚函数。
如果C
要覆盖sleep()
,那么它将建立一个新的VTable:
fn_t C::VTableB[] = { &C::sleep };
C::C()
{
A::VPtr = C::VTable;
B::VPtr = C::VTableB;
}
相关文章:
- 关于C++中具有多重继承"this"指针的说明
- C++中模板化异常类的多重继承
- 虚拟继承中是否存在多重继承?
- 如何在 c++ 多重继承中调用父非虚函数?
- 多重继承相同的方法名,没有歧义
- 使用enable_if解决多重继承歧义
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 有没有办法实现从 c++ 中其他抽象类多重继承的抽象类?
- 实现具有多重继承的纯虚函数
- 使用多重继承实现实体组件编程
- GCC 看不到通过多重继承实现
- 如何使用多重继承实现多态行为
- C++的多重继承和多重实现编译但崩溃
- C++:实现多重继承时的最佳实践
- 虚函数表实现多重继承
- 多重继承和指针实现
- 如何正确实现多重继承
- 虚拟功能实现和多重继承
- 如何在多重继承中实现具有相同名称的虚拟函数
- 来自同一父级的多重继承-合并实现