是vptr的名字在C++中被破坏了吗?
问题描述:
虽然有很多关于如何在C++中处理虚函数的文章,但我无法清除一个基本的疑问。被基类变量覆盖的派生类的vptr变量。 ptr变量的名字是否已被破坏?是vptr的名字在C++中被破坏了吗?
Class Base
{
public:
virtual void test();
};
class Derived
{
public:
virtual void test();
};
如果我打电话
Base b = new Derived();
b->test();
将其转换为
(*b->vptr[<index>])(b);
哪里指数点的V表项。
我的疑问是这个vptr的名字是否已经损坏?
答
C++标准甚至不承认多态类中存在vptr
,因为它是一个实现细节,因此它甚至不需要编译器以这种方式实现虚函数。所以不,vptr
不是一个保留关键字(这是我认为你想要问的)。
答
你也不会在C访问的vptr ++的语言意味着这样回答“不” - 没有这样的变量和名称,因此没有其重整:)
我有这样的疑问,因为,如果它被初始化为基类对象指针派生类(在我的情况b),调用虚函数,它将使用vptr,它是基类vptr或子类vptr? –
它是基类vptr(它也存在于所有派生类中)指向派生类的虚拟表。当然,所有这些都是依赖于实现的,所以你不能从你的C++代码访问它。 – slartibartfast