Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果派生类还具有基类中不存在的虚拟函数,则创建的vptr数_C++_Vtable_Vptr_Run Time Polymorphism - Fatal编程技术网

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

C++ 如果派生类还具有基类中不存在的虚拟函数,则创建的vptr数,c++,vtable,vptr,run-time-polymorphism,C++,Vtable,Vptr,Run Time Polymorphism,我想知道是否为解析虚拟函数创建了两个vptr,一个在基类中,该基类将在func1的派生类对象中继承,另一个在func2的派生对象中继承 在我的GCC上: class Base { public: virtual void func1() { std::cout<<"Base func1"<<std::endl; } //virtual destructor }; class Derived : public Ba

我想知道是否为解析虚拟函数创建了两个vptr,一个在基类中,该基类将在func1的派生类对象中继承,另一个在func2的派生对象中继承

在我的GCC上:

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;
}
所以一个vtable指针就足够了。我希望大多数其他编译器都会以同样的方式运行

派生类还具有基类中不存在的虚函数


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

vtable/vptr问题是特定于平台的实现细节,std一般不涉及。我可以想象没有对象内vptr的实现。但在我所知道的大多数平台上,只有一个vptr条目可用于单继承和虚拟继承的所有用途。但是,不保证这是可移植的行为

你检查过这两类的尺码了吗。它不会提供一个通用的答案,但可能会有所帮助。在链接实现中,派生类中只有一个vptr。我已经检查了基类对象和派生类对象的大小,在我的系统上显示为8字节。但据我所知,应该在派生类对象中创建两个vptr,在基类对象中创建一个vptr。你为什么这么认为?如果GCC在派生中仅创建一个vptr,并且我们假设它符合标准规范,那么该标准不能要求2个vptr。顺便说一句,标准中根本没有提到术语vptr、vtable和虚拟表。虚拟表机制似乎是一个实现问题。@Naresh应该被创建为什么?我可以想象这样的impl是如何工作的?总的来说,这会泄漏内存吗?@curiousguy为什么会泄漏?一种可能的实现是一个静态关联数组,它保存pairsstatic map rtti;的记录;。如果对象没有被正确销毁,它就会泄漏。@奇怪的是,它与vt无关。内存管理机制负责正确的销毁和释放;类型是否是多态的无关紧要。如何清理映射?
std::cout << sizeof(void*) << ' ' << sizeof(Derived) << '\n';
// Prints 8 8