vtable如何处理多重继承?
How does vtable handle multiple inheritance?
我了解对于单继承,添加了一个指向虚函数 table 的指针以确定在运行时调用哪些父 class 函数。
class Genius {
int IQ;
public:
virtual void brag();
};
class Me : public Genius {
int age;
};
实例化时,Me
的内存布局应该类似于
pointer to Genius vtable
int iq
int age
但是在多重继承的情况下会发生什么?
// Assume CoolDude has virtual functions as well
class Me : public Genius, public CoolDude {
int age;
};
现在 Me
class 的内存布局是什么样的?如何处理多重继承?
class 将有 2 个指向 vtables 的指针,一个指向 Genius
的实现,一个指向 CoolDude
的实现。当强制转换为基数 class 时,返回的指针将与原始指针的差异在于 vtable(和其他成员)或基数 class 的偏移量。
我了解对于单继承,添加了一个指向虚函数 table 的指针以确定在运行时调用哪些父 class 函数。
class Genius {
int IQ;
public:
virtual void brag();
};
class Me : public Genius {
int age;
};
实例化时,Me
的内存布局应该类似于
pointer to Genius vtable
int iq
int age
但是在多重继承的情况下会发生什么?
// Assume CoolDude has virtual functions as well
class Me : public Genius, public CoolDude {
int age;
};
现在 Me
class 的内存布局是什么样的?如何处理多重继承?
class 将有 2 个指向 vtables 的指针,一个指向 Genius
的实现,一个指向 CoolDude
的实现。当强制转换为基数 class 时,返回的指针将与原始指针的差异在于 vtable(和其他成员)或基数 class 的偏移量。