有些东西我仍然没有得到。

对于我声明的每个类,都有一个隐藏的 vptr 成员指向类虚拟表。

假设我有这个声明:

class BASE
{
    virtual_table* vptr; //that's hidden of course , just stating the obvious
    virtual void foo();
}

class DERIVED : public BASE
{
   virtual_table* vptr; //that's hidden of course also
   virtual void foo();
   virtual void cho();
}

首先我想了解一些东西,对于派生和基础的 vptr 是否真的是相同的成员名称?

其次,在这种情况下会发生什么:
base* basic = new derived();

我明白了,基本变量得到了派生的 vptr,但这是怎么发生的?因为通常在发生转换时,派生的基础部分(包括基础的 vptr)应该分配给基础,而不是派生的 vptr。如果两个类中都有一个同名的变量,我不知道可能会有所不同。

第三个也是最后一个问题:
当我有
 base* basic = new derived();

有没有办法调用 basic-base 的成员函数,即使它是虚拟的?

谢谢

最佳答案

首先,是的,它是同一个成员。它在运行基本构造函数时自动分配第一次,并在运行派生构造函数时自动分配第二次。 (在默认的空构造函数的情况下,base 的无用赋值被优化掉了。)

第二,没有真正的转换。事实上,推导可以命名为“是一个”关系。在这种情况下,派生的“是一个”基础。如果考虑派生对象的内存的第一个字节,它们与基础对象的第一个字节具有相同的含义。

第三,可以调用基本成员函数如下:basic->base::foo();

关于c++ - vptr - 虚拟表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1831635/

10-10 09:04