class Base
{
public:
virtual void func1()
{
std::cout<<"Base func1"<<std::endl;
}
//virtual destructor
};
class Derived : public Base
{
public:
virtual void func1()
{
std::cout<<"Derived Base func1"<<std::endl;
}
virtual void func2()
{
std::cout<<"Derived func2"<<std::endl;
}
};
int main()
{
Derived *d = new Derived;
delete d;
}
我想知道是否会创建两个用于解析虚函数的"vptr",一个在 Base
类中,该类将在func1
类对象中继承Derived
另一个在Derived
对象中继承用于func2
。
在我的 GCC 上:
std::cout << sizeof(void*) << ' ' << sizeof(Derived) << 'n';
// Prints 8 8
所以一个 vtable 指针就足够了。我希望大多数其他编译器的行为方式相同。
派生类也有一个虚函数,该函数在基类中不存在
Derived
中添加的虚函数可能只是简单地放在 vtable Derived
的末尾,在从 Base
继承的函数之后。
vtable/vptr 问题是特定于平台的实现细节,通常不在 std 中。我可以想象根本没有对象内 vptr 的实现。但是在我知道的大多数平台上,只有一个 vptr 条目可用于单一继承和虚拟继承的所有目的。但是,不能保证这是可移植行为。