类继承错误:私有成员

use*_*094 1 c++ inheritance private class parent

我有一个基类/父类:Person

还有两个子类/子类:Player,Coach

这就是基类Person的标题:

class Person
{
    public:
        Person(string name);
        Person();
        virtual ~Person();
        string getName();
        void setName(string name);
        virtual void printSpec() const = 0;

    private:
        string name;
};
Run Code Online (Sandbox Code Playgroud)

我试图编译并运行,它开始抱怨这个:

include\Person.h||In constructor 'Coach::Coach(std::string, std::string)':|
include\Person.h|19|error: 'std::string Person::name' is private|
\src\Coach.cpp|5|error: within this context|
||=== Build finished: 2 errors, 0 warnings ===|
Run Code Online (Sandbox Code Playgroud)

并指出:

private:
    string name;
Run Code Online (Sandbox Code Playgroud)

在子类"Coach"的两个构造函数中的一个的上下文中:

Coach::Coach(string name, string responsibility): Person(name){
    this->name = name;
    this->responsibility = responsibility;
}
Run Code Online (Sandbox Code Playgroud)

但是,它并没有对"Player"类的构造函数中的同一行提出相同的抱怨,只是在"Coach"类的构造函数中抱怨"字符串名称是私有成员".

我为其他人查找了一些解决方案,尝试保护而不是私有,尝试更改变量的名称,但没有用.

是什么赋予了?

Pie*_*aud 5

private成员不能由派生类访问.

解决方案可能是使用member-initialization-list来做到这一点:

Coach::Coach(string name, string responsibility): Person(name){
    //                                            ^^^^^^^^^^^^
    //                     Initialize the name through the base class constructor
    this->responsibility = responsibility;
}
Run Code Online (Sandbox Code Playgroud)

因为Person基类并且有一个带名字的构造函数,所以你可以这样做.您不需要name从派生类访问该成员.


另一个解决方案可能是设置此成员protected(第一个解决方案仍然更好).

class Person
{
    public:
        Person(string name);
        Person();
        virtual ~Person();
        string getName();
        void setName(string name);
        virtual void printSpec() const = 0;

    protected:
//  ^^^^^^^^^
        string name;
};
Run Code Online (Sandbox Code Playgroud)

你可以看看这里,继承部分谈谈访问类型.


不回答这个问题,但对于一些好的做法,我建议你传递string参数作为const参考.这是一个更好的做法:

Coach::Coach(const string& name, const string& responsibility): Person(name){
    //       ^^^^^       ^       ^^^^^       ^
    this->responsibility = responsibility;
}
Run Code Online (Sandbox Code Playgroud)