有些东西我仍然没有得到。
对于我声明的每个类,都有一个隐藏的 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/