初始化依赖于子类的继承类的常量类成员

Initialize constant class member of inherited class depended of subclass

本文关键字:常量 成员 依赖于 继承 初始化 子类      更新时间:2023-10-16

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

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
(( 的实例后调用终止::bad_alloc

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

使用-Wextra-Wall编译代码;

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

如果一个名字是你想要的:

以编程方式获取派生类的名称

实际上,有一个 int 可能会更好,所以你可以打开它,这可能是最简单的,使用一个简单的覆盖方法,如 public:int getClassID(({ return constant_# ; },所以每个类只有一个 #,而不是实例变量。 编译器可以内联它,因此它具有变量的效果。