c++ - 如果派生类还具有基类中不存在的虚函数,则创建的 vptr 数

标签 c++ vtable vptr run-time-polymorphism

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 类中,它会在 Derived 类对象中继承func1func2Derived 对象中的另一个对象。

最佳答案

在我的 GCC 上:

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

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

derived class also has a virtual function which is not present in Base class

Derived 中添加的虚函数可能只是简单地放在 Derived vtable 的末尾,在从 Base 继承的函数之后。

关于c++ - 如果派生类还具有基类中不存在的虚函数,则创建的 vptr 数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55492291/

相关文章:

Python - typemap 中的 SWIG 不起作用

methods - Rust 的特征对象如何处理移动实例的方法?

c++ - 什么时候为对象设置虚拟表指针(在 C++ 中)?

c++ - memcpy派生类转基类,为什么还是调用基类函数

C++ 和 DirectX 9 - 调用 D3DXLoadMeshFromX 时出现解析错误

c++ - 创建大量对象 C++

c++ - C++ 程序中的虚拟表和虚拟指针的数量

c++ - 获取所有现有 vtables 的列表

c++ - std::setw、std::setfill 等的真正返回类型是什么?

c++ - 为什么虚拟表很重要?