【发布时间】:2013-08-30 11:01:20
【问题描述】:
我有一个基类/父类: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;
};
我试图编译和运行,它开始抱怨这个:
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”类的构造函数中的“字符串名称是私有成员” .
我为其他人查找了一些解决方案,尝试了保护而不是私有,尝试更改变量的名称,但没有用。
什么给了?
【问题讨论】:
-
如果您已经在 Coach 构造函数中调用了 Person(name),为什么还需要设置 this->name?我假设 Person::Person 会处理这个问题?在任何情况下,受保护的范围都应该起作用。
-
获取decent book on C++。
Player::name是私人的。如果您希望派生类具有成员级别的访问权限(在这种情况下没有理由这样做,但那是另一回事),则需要 protected 或 public 或 friend-ed(后者对于派生类非常不寻常)。 -
如何声明 Coach 类? (不要忘记在其中也使用公共词)
-
我现在可以在受保护的情况下使用它,谢谢。我有一些示例代码,它有私有成员和两个子类,它们可以顺利使用该成员。或者我一定是错过了一些技巧来让它全部工作,或者它可能都是预编译的。无论如何,现在问题解决了。
-
不要对其进行保护。
Person的构造函数将初始化它。
标签: c++ class inheritance parent private