如何使用多重继承内联虚拟

how to inline virtual with multiple inheritance

本文关键字:虚拟 多重继承 何使用      更新时间:2023-10-16

请不要抨击我或说我问这个问题是错误的,或者多重继承是邪恶的。这个问题是为了更好地了解C++编译器是如何工作的。我知道 inline 语句用于提示编译器用源代码替换函数调用,编译器可以选择或不内联函数。如果您可以强制inline功能,那就太好了,但这不是我真正要解决的问题。我想做的是能够创建一段代码,该代码在一个地方编写,并由编译器复制和粘贴到其他地方。我编写的代码如下所示:

struct base 
{
    virtual double eval() = 0; // should be no eval function for the
};
struct foo : public base
{
    virtual double eval() overrides
    {
          return //foo eval
    }
};
struct bar : public base
{
    virtual double eval() overrides
    {
          return //foo eval
    }
};
struct baz : public base
{
    virtual double eval() overrides
    {
          return //baz eval
    }
};
struct FooBarBaz : public foo, public bar, public baz
{
    virtual double eval() final
    {
          return foo::eval() + bar::eval() + baz::eval();
    }
};

编译器将生成等效于以下内容的内容:

struct base 
{
    virtual double eval() = 0; // should be no eval function for the
};
struct foo : public base
{
    virtual double eval() overrides
    {
          return //foo eval
    }
};
struct bar : public base
{
    virtual double eval() overrides
    {
          return //foo eval
    }
};
struct baz : public base
{
    virtual double eval() overrides
    {
          return //baz eval
    }
};
struct FooBarBaz : public foo, public bar, public baz
{
    virtual double eval() final
    {
          return /*foo eval*/ + /*bar eval*/ + /*baz eval*/
    }
};

有人告诉我,使用<type_traits>是解决此问题的方法,如果这是真的,我想知道如何获得预期的结果。 如果没有,我想知道如何做到这一点

编译器是否决定内联取决于它编码的启发式方法......但是没有理由不从FooBarBaz::eval内联对foo::evalbar::evalbaz::eval的调用,因为该限定禁用了动态调度。

也就是说,当编译器遇到合格的调用foo::eval时,它将执行该成员函数的最终覆盖器,级别为foo。它不会使用 vtable(无论如何都会以无限递归结束,因为最终的覆盖器将是 FooBarBaz::eval

除此之外,您应该阅读有关虚拟继承的信息,该FooBarBaz3 个类型 base 的子对象,可能不是您想要的......