问题描述
我知道禁止从基本ctor调用虚拟函数,这是有原因的。但是我认为,如果func是“非常常量”,那么这些原因就变得无关紧要了。 “非常常量”表示该函数可以直接替换常量,如下所示:
Color Derived::getColor() const
{
return Color(0,255,0); // no member usage,no member function calls -
// only return
}
(我之所以使用函数,是因为我需要它的 virtuality 。)我可以说一下编译器该函数是“非常常量”吗? (这将允许我从ctor调用该函数。)
解决方法
如果从基类构造函数调用虚拟方法,则将获得基类方法,而不是任何覆盖的方法。
(实际上,根据实际情况,这可能是不确定的行为,但这是通常的实际效果)。
,可能不是最简单的解决方案,但是CRTP可以帮助解决此类问题...
template <typename Derived>
struct Base {
Base() {
c = getColor();
}
int getColor() const {
return static_cast<const Derived&>(*this).getColor();
}
int c;
};
struct D1 : Base<D1> {
int getColor() const {
return 1;
}
};
struct D2 : Base<D2> {
int getColor() const {
return 2;
}
};