C++:为什么我的DerivedClass的构造不能访问BaseClass的的保护领域?

dwi*_*ell 30 c++ inheritance constructor protected access-specifier

我有一个构造函数尝试初始化基类中的字段.编译器抱怨.该字段受到保护,因此派生类应具有访问权限.

//The base class: 

class BaseClass

{

public:

    BaseClass(std::string);
    BaseClass(const BaseClass& orig);
    virtual ~BaseClass();
    const std::string GetData() const;
    void SetData(const std::string& data);
protected:

    BaseClass();
    std::string m_data;

};

BaseClass::BaseClass(const std::string data) : m_data(data) { }

BaseClass::BaseClass() { } 

BaseClass::BaseClass(const BaseClass& orig) { }

BaseClass::~BaseClass() { }

void BaseClass::SetData(const std::string& data)
{
    m_data = data;
}

const std::string BaseClass::GetData() const
{
    return m_data;
}


//The derived class: 


class DerivedClass : public BaseClass
{

public:

    DerivedClass(std::string data);
    DerivedClass(const DerivedClass& orig);
    virtual ~DerivedClass();
private:

};

DerivedClass::DerivedClass(std::string data) : m_data(data) { } //ERROR HERE

DerivedClass::DerivedClass(const DerivedClass& orig) { }

DerivedClass::~DerivedClass() { }
Run Code Online (Sandbox Code Playgroud)

//编译错误

DerivedClass.cpp:3:错误:类"DerivedClass"没有任何字段命名为"M_DATA"

任何帮助是极大的赞赏.先感谢您.

Zit*_*rax 47

您不能在派生类构造函数中初始化m_data,而是将其作为参数传递给基类构造函数.

那是: DerivedClass::DerivedClass(std::string data) : BaseClass(data) { }


nev*_*ves 9

在初始化列表中,您只需为同一类的属性设置值.要访问它,您必须在构造函数的主体中赋值:

DerivedClass :: DerivedClass(s​​td :: string data){m_data = data; }

或者,如果复制对象的成本很高,则将m_data作为参数传递给父类构造函数:

DerivedClass :: DerivedClass(s​​td :: string data):BaseClass(data){}

提示:将数据作为参考传递以防止复制构造函数.

在这里查看更多信息:C++构造函数的初始化顺序.