gpt4 book ai didi

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

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

请不要抨击我或说我问这个问题是错误的或多重继承是邪恶的。这个问题是为了更好地理解 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>是解决这个问题的方法,如果这是真的,我想知道如何获得预期的结果。如果没有,我想知道该怎么做

最佳答案

编译器是否决定内联取决于它编码的启发式方法……但没有理由不内联对 foo::evalbar 的调用::evalbaz::eval 来自 FooBarBaz::eval 因为资格禁用动态调度。

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

除此之外,您应该了解虚拟继承FooBarBaz3 个类型为base 的子对象,可能不是你想要的...

关于c++ - 如何使用多重继承内联虚拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28120964/

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