类继承错误:私有成员

时间:2013-08-27 15:33:24

标签: c++ class inheritance parent private

我有一个基类/父类:人

两个子类/子类: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;
};

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

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 ===|

并指出:

private:
    string name;

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

Coach::Coach(string name, string responsibility): Person(name){
    this->name = name;
    this->responsibility = responsibility;
}

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

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

是什么给出了?

3 个答案:

答案 0 :(得分:5)

派生类无法访问private成员。

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

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

因为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;
};

你可以看一下here,继承部分谈谈访问类型。


不回答这个问题但是对于一些好的做法,我建议您将string参数作为const参考传递给我。这是better practice

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

答案 1 :(得分:2)

name在基类中是私有的,因此您无法从派生类访问它。
假设Coach从Person公开派生,你可以使成员变量受到保护,但幸运的是Person构造函数采用了一个名称,所以你不需要直接从派生类中访问它。您可以使用初始化列表,因此无需设置两次

Coach::Coach(string name, string responsibility)
                   : Person(name){
                 //  ^^^^^^^^^^^^
                 // Sends name to Person's constructor
    this->responsibility = responsibility;
}

答案 2 :(得分:1)

将“private”更改为“protected”private表示系统的其他任何部分(包括派生类)都不能访问该成员。