从子类设置const成员值

时间:2012-04-03 19:22:12

标签: c++ constructor const

代码:

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的“继承切片”尚未初始化。

我尝试了几种没有运气的解决方法,我会在这里省略它们。有没有办法实现我想要做的事情?

2 个答案:

答案 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) { }
};