可以通过[重复]在派生类中初始化受保护的基类成员
Posted
技术标签:
【中文标题】可以通过[重复]在派生类中初始化受保护的基类成员【英文标题】:Can protected base class members be initialized in a derived class via [duplicate] 【发布时间】:2016-06-30 06:28:14 【问题描述】:为了方便 RTTI,我考虑过初始化一个受保护的基类成员 使用枚举变量。
class myBase
public:
typedef enum class mySubType base, type1 ;
myBase() : myType( mySubType::base )
virtual ~myBase();
protected:
mySubType myType;
;
现在,要在派生类中初始化它,我可以编写派生类吗? CTor 是这样的:
myDerived::myDerived() : myBase(), myType( mySubType::type1 )
???
【问题讨论】:
您是否期望protected
能够在public
不工作时使其工作?
你是怎么得到这个想法的?我把它保护起来了,所以有一点机会它会起作用。否则我会将其设为私有。
问题是为什么你认为如果它不能与public
一起使用,它会以某种方式与protected
一起使用?
您的问题假设我已经知道它不适用于public
- 我从未想到过这个想法,因为为什么要公开数据成员?这将违反数据封装!
typedef enum class mySubType...
中不需要 typedef
,它将被忽略,编译器也会产生警告。
【参考方案1】:
抱歉,这是不可能的。见这里:C++ error initializing base class data member in the derived class member initialization list
基本上,您必须重写基本 CTor 声明以接受该枚举,如下所示:
myBase( mySubType _t = mySubType::base ) : myType( _t )
通过使 CTor 也不接受任何参数,您已经定义了一个默认 CTor,它可以在使用 std 容器时派上用场。
最后以这种方式在派生类中使用它:
myDerived::myDerived() : myBase( mySubType::type1 )
【讨论】:
以上是关于可以通过[重复]在派生类中初始化受保护的基类成员的主要内容,如果未能解决你的问题,请参考以下文章