来自基本ctor

问题描述

我知道禁止从基本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;
    }
};