Update:用一个直接向上的方法调用示例替换析构函数示例。
嗨,
如果我有以下代码:
class a
{
public:
virtual void func0(); // a has a VTable now
void func1();
};
class b : public a
{
public:
void func0() { a::func0(); }
void func2();
};中没有a::VTable 0()调用,那么对上述问题的回答会有所不同吗?
谢谢
发布于 2009-09-05 16:04:57
如果您声明了虚拟函数,那么还应该声明您的析构函数虚拟;-)。
func0()。如果您在基类中声明一个函数(包括析构函数)为虚拟函数,那么它的所有派生类都将具有相同签名的虚拟函数。这会让他们有一个vtable。此外,即使您没有在其中声明explicitly.func0()是虚拟的.还有一个棘手的细节,尽管这不是你问题的要点。您将函数B::func0()声明为内联函数。在gcc编译器中,如果一个虚拟函数是内联声明的,它就会将它的插槽保留在虚拟表中,该槽指向为该内联函数发出的一个特殊函数(这意味着它的地址,这使得内联发出)。这意味着函数是否是内联函数并不影响vtable中插槽的数量及其对类的必要性。
发布于 2009-09-05 16:01:26
是的,因为它的基类有一个;而且它的析构函数是虚拟的(即使您没有声明它是虚拟的),因为基类的析构函数是virtual.
发布于 2009-09-05 17:00:45
关于更新的例子:
一些额外的注释(编译器依赖的,但这些是相当常见的泛化):
B的每个实例都有一个指向vtable的指针,因为您来自一个具有虚拟functions.
的指针正确地访问b的实例。
https://stackoverflow.com/questions/1383650
复制相似问题