0
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”,一个在“基”类中,它将在 func1() 的派生类对象中继承,另一个在 func2() 的“派生”对象中。

4

2 回答 2

1

在我的 GCC 上:

std::cout << sizeof(void*) << ' ' << sizeof(Derived) << '\n';
// Prints 8 8

所以一个 vtable 指针就足够了。我希望大多数其他编译器的行为方式相同。

派生类也有一个虚函数,它在基类中不存在

添加的虚函数Derived可能只是简单地放在 vtable 的末尾Derived,在继承自Base.

于 2019-04-03T10:03:19.270 回答
0

vtable/vptr 问题是特定于平台的实现细节,通常不包含在标准中。我可以想象根本没有对象内 vptr 的实现。但是在我知道的大多数平台上,只有一个 vptr 条目可以满足单一继承和虚拟继承的所有目的。但是,不保证这是可移植的行为。

于 2019-04-03T22:21:03.757 回答