首页 > 解决方案 > 初始化依赖于子类的继承类的常量类成员

问题描述

假设我有一个这样的模板基类:

class Util {
public: 
    Util(const std::string& suffix) : name(base_name + "." + suffix) {}
protected:
    const std::string base_name = "Util";
    const std::string name;
};

我想创建一些具有不同名称的子类。

我可以这样做:

class WorkingUtil : public Util {
public:
    WorkingUtil() : Util("Working") {}
};

但不是这样:

class Bad1Util : public Util {
public:
    Bad1Util() : Util(suffix) {}
private:
    const std::string suffix = "Bad1";
};

也不是这个:

class Bad2Util : public Util {
public:
    Bad2Util() : suffix("Bad2"), Util(suffix) {}
private:
    const std::string suffix;
};

这是一个godbolt示例和错误:

在抛出 'std::bad_alloc'
what() 的实例后调用终止:std::bad_alloc

这里到底有什么问题?我可以像上面的例子那样做,但我想知道为什么其他的不可接受。

标签: c++inheritanceinitialization

解决方案


-Wextra用and编译你的代码-Wall

<source>:49:9: warning: field 'suffix' will be initialized after base 'Util' [-Wreorder-ctor]

        suffix("Bad2"),

推荐阅读