gpt4 book ai didi

c++ - 虚拟表中的条目数

转载 作者:行者123 更新时间:2023-11-28 06:17:29 25 4
gpt4 key购买 nike

在单继承层次结构的情况下,vTable 中的条目数是否总是等于类定义的虚函数数?

class A
{
public:
virtual void funcA(){}
};

class B: public A
{
public:
virtual void funcA(){}
virtual void funcB(){}
};

在上面的例子中,classB 的 vTable 将只有一个 funcA() 的条目?

多重继承考虑以下继承层次结构。

class Base1
{
public:
Base1(){}
virtual ~Base1(){}
virtual void speakClearly(){}
virtual Base1 *clone() const{return new Base1;}
protected:
float data_Base1;
};

class Base2
{
public:
Base2(){}
virtual ~Base2(){}
virtual void mumble(){}
virtual Base2 *clone() const{return new Base2;}
protected:
float data_Base2;
};

class Derived : public Base1, public Base2
{
public:
Derived(){}
virtual ~Derived(){}
virtual Derived *clone() const{return new Derived;}
protected:
float data_Derived;
};

上面的例子摘自 Inside C++ object model 一书。在书中提到派生类将包含两个 vTable,一个用于 Base1 子对象,一个用于 Base2 子对象。

书中显示的 Base1 子对象 vTable 有一个条目 Base2::mumble(),这似乎不正确。它不应该有 Base2::mumble() 条目,我说得对吗?

最佳答案

虚拟分派(dispatch)的实现方式在标准中没有具体说明,所以每个编译器都可以自由地做任何它喜欢的事情,只要它能工作。所以,你的问题没有权威的答案。

In the above example vTable for classB will have only one entry for funcA()?

不一定,例如编译器可能会注意到基方法和派生方法是相同的实现,并为 B 创建一个 vtable,它具有指向两个虚函数的指针,然后为 A 使用相同的 vtable。但是,由于与拥有一个相关的原因,很可能不会如下所述,指向 RTTI 信息的额外不同指针....

The Base1 subobject vTable in the book is shown to have an entry Base2::mumble() which does not seem to be correct. It should not have Base2::mumble() entry , Am I right?

从您自己的描述来看,您确实是对的。

number of entries in a vTable is equal to number of virtual functions defined by a class

同样,没有什么是标准化的,但另一个考虑是往往需要一些非 virtual-dispatch/function-address 运行时类型信息来支持 dynamic_cast 和 typeid/typeinfo,并且一些实现可能在同一张表中保留指向它的指针;它是否被视为“v”表的一部分是一个任意的术语区分。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com