代码:
struct A{
const bool const_some_write_once_flag;
A(): const_some_write_once_flag(false) { }
};
struct B: public A{
B(): const_some_write_once_flag(true) { }
};
错误是:类'B'没有任何名为'const_some_write_once_flag'的字段。我相信这是因为在B
的构造函数中,正在创建的对象尚未属于A
类型,因为A
的“继承切片”尚未初始化。
我尝试了几种没有运气的解决方法,我会在这里省略它们。有没有办法实现我想要做的事情?
答案 0 :(得分:6)
在其初始化列表中,B
只能初始化自己的数据成员,直接基类和任何虚拟基类。 const_some_write_once_flag
不是这些;它是A
的数据成员。它只能由A
的构造函数初始化。
struct A{
const bool const_some_write_once_flag;
A(): const_some_write_once_flag(false) { }
protected:
A(bool flag) : const_some_write_once_flag(flag) { }
};
struct B: public A{
B(): A(true) { }
};
答案 1 :(得分:0)
以下几乎可以实现您的目标。它确实创建了A的受保护成员,但是任何其他选择从A继承的类都可以使用它。你可以更加保护并使B成为A的朋友,然后制作一个将参数设为私有的构造函数。
class A{
public:
const bool const_some_write_once_flag;
A(): const_some_write_once_flag(false) { }
protected:
A( const bool initialValue ): const_some_write_once_flag( initialValue ) {}
};
class B: public A{
public:
B(): A(true) { }
};