可以通过[重复]在派生类中初始化受保护的基类成员

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 ) 

【讨论】:

以上是关于可以通过[重复]在派生类中初始化受保护的基类成员的主要内容,如果未能解决你的问题,请参考以下文章

C++ - 在派生类中静态初始化基类受保护的成员变量

访问派生类中的受保护成员

C#:基类中的受保护方法;无法使用来自另一个类的派生类对象进行访问[重复]

如何影响派生类中受保护的基变量

protectedpublicprivate

从派生类访问基类中的受保护成员