【发布时间】:2015-03-23 03:28:44
【问题描述】:
请不要抨击我,或者说我问这个问题是错误的,或者说多重继承是邪恶的。这个问题是为了更好地理解 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> 是解决此问题的方法,如果这是真的,我想知道如何获得所需的结果。如果没有,我想知道如何做到这一点
【问题讨论】:
-
你知道编译器是否已经在执行你想要的吗?您是否尝试过设置优化级别,然后查看汇编语言列表?
-
请原谅我的无知,但您如何看待
inlined代码与多重继承的不同工作方式? -
我对编译器持中立态度,并且对汇编语言有很好的理解。至于
inline代码,编译器将从使用基函数调用的代码中获取代码,并将代码粘贴到派生函数中,而不是通过 v-table 查找函数 -
foo::eval()、bar::eval()和baz::eval()无论如何都不是虚拟呼叫,AFAIK。 -
既然“代码写在一个地方,由编译器复制粘贴到其他地方”是内联的定义,你这样说没有意义当您想要“在一个地方编写并由编译器在其他地方复制和粘贴的代码”时,强制内联“并不是真正的问题”
标签: c++ c++11 inline multiple-inheritance typetraits