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"类的构造函数中抱怨"字符串名称是私有成员".
我为其他人查找了一些解决方案,尝试保护而不是私有,尝试更改变量的名称,但没有用.
是什么赋予了?
甲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)