gpt4 book ai didi

C++ 继承/VTable 问题

转载 作者:可可西里 更新时间:2023-11-01 15:37:16 25 4
gpt4 key购买 nike

更新:用直接的方法调用示例替换了析构函数示例。

你好,

如果我有以下代码:

class a
{
public:
virtual void func0(); // a has a VTable now
void func1();
};
class b : public a
{
public:
void func0() { a::func0(); }
void func2();
};
  1. B 中有虚表吗? B 没有虚函数,但从 b::func0() 调用 a::func0()
  2. func1 是否驻留在 VTable 中?它不是虚拟的。
  3. func2 是否驻留在 VTable 中?
  4. 如果 b::func0() 中没有 a::func0() 调用,上述答案是否会有所不同?

谢谢

最佳答案

如果你声明了虚函数,你也应该声明你的析构函数为 virtual ;-)。

  1. B有一个虚表,因为它有一个虚函数,即func0()。如果您在基类中声明一个函数(包括析构函数)为 virtual,则其所有派生类也将具有具有相同签名 virtual 的函数。这将使他们拥有一个 vtable。此外,即使您没有在其中显式声明 func0,B 也会拥有 vtable。

  2. 非虚函数不通过虚表引用。

  3. 见 2.

  4. 没有。类的 vtables 是基于类声明构建的。不考虑类函数的主体(更不用说其他函数了)。因此,B 有一个 vtable,因为它的函数 func0() 是虚函数。

还有一个棘手的细节,尽管它不是您问题的要点。您将函数 B::func0() 声明为内联函数。在 gcc 编译器中,如果一个虚函数被声明为内联,它会在虚表中保留它的槽,槽指向为该内联函数发出的特殊函数(这算作获取它的地址,这使得内联发射)。这意味着,函数是否内联不会影响 vtable 中的插槽数量及其对类的必要性。

关于C++ 继承/VTable 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1383650/

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