如何使用多重继承内联虚拟
how to inline virtual with multiple inheritance
请不要抨击我或说我问这个问题是错误的,或者多重继承是邪恶的。这个问题是为了更好地了解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::eval
、bar::eval
和baz::eval
的调用,因为该限定禁用了动态调度。
也就是说,当编译器遇到合格的调用foo::eval
时,它将执行该成员函数的最终覆盖器,级别为foo
。它不会使用 vtable
(无论如何都会以无限递归结束,因为最终的覆盖器将是 FooBarBaz::eval
。
除此之外,您应该阅读有关虚拟继承的信息,该FooBarBaz
有 3 个类型 base
的子对象,可能不是您想要的......
相关文章:
- 虚拟继承中是否存在多重继承?
- 多重继承导致虚假的模糊虚拟函数过载
- 仅函数的多重继承 - 没有虚拟和 CRTP
- 使用具有虚拟多重继承的基构造函数
- 具有虚拟多重继承的构造函数定义
- 通过相同的纯虚拟方法,来自不同抽象基础的C 多重继承
- 虚拟继承如何解决 c++ 中的多重继承(钻石)?它将走哪条路
- C 多重继承,虚拟方法覆盖问题和协变量返回类型
- 关于C 接口(纯虚拟类)/多重继承/虚拟继承的设计Qustion
- 纯虚拟继承、多重继承和C4505
- 虚拟多重继承和强制转换
- 使用虚拟基类时,多重继承是如何工作的
- 纯虚拟函数和多重继承
- 可以通过虚拟支持多重继承
- 如何使用多重继承内联虚拟
- 虚拟类多重继承
- MinGW 4.7.0 到 4.7.2 错误:使用混合虚拟和非虚拟多重继承时成员函数中的"this"指针无效
- C++纯虚拟多重继承
- 如果QObject是从direct派生的,那么使用“虚拟”多重继承是否安全?
- 虚拟多重继承和指针