所以我做了这个课:
class Book
{
public:
Book(string newTitle = "???", string newAuthor = "???");
virtual ~Book();
string getTitle();
string getAuthor();
void setTitle(string newTitle);
void setAuthor(string newAuthor);
virtual string allInfo();
private:
string title;
string author;
};
我将在其他两个课程中介绍allInfo()
- 函数
一个叫HardcoverBooks
,另一个叫AudioBooks
。两者均继承自Book
。
这是我之后在两个类的.cpp
个文件中所做的,首先是AudioBook
类:
string AudioBook::allInfo(){
stringstream newString;
newString<<"Title: "<<this->title<<endl<<"Author: "<<this->author<<endl
<<"Narrator: "<<this->narrator<<endl
<<"Length(in minutes): "<<this->length<<endl<<endl;
return newString.str();
}
这是HardcoverBook
课程中的内容:
string HardcoverBook::allInfo(){
stringstream newString;
newString<<"Title: "<<this->title<<endl<<"Author: "<<this->author<<endl
<<"Pages: "<<this->pages<<endl<<endl;
return newString.str();
}
除了AudioBook
班正在抱怨这个问题外,一切都工作正常而花花公子:
include \ Book.h ||在成员函数'virtual std :: string中 有声书:: allInfo()“:| include \ Book.h | 41 |错误:'std :: string Book :: title'是私人的| mningsuppgiftIIB的\ src \ AudioBook.cpp | 27 |错误: 在这种情况下| include \ Book.h | 42 |错误:'std :: string Book :: author'是私人的| mningsuppgiftIIB的\ src \ AudioBook.cpp | 27 |错误: 在这种情况下| || ===构建完成:4个错误,0个警告=== |
但在HardcoverBook
中,它并没有抱怨这一点,奇怪的是。
我的问题:
我该怎么做才能完成这项工作? (即使两个类能够以自己的方式使用函数allInfo()
)
为什么它不能像这样工作?
编辑: 这是我正在做的一些功课,其中一个要求是将成员变量和属性设为私有。所以受保护确实起作用,对那些人来说是赞誉,但我会添加另一个红利问题:
答案 0 :(得分:3)
title
和author
成员为private
。这意味着它们在子类中不可见,例如AudioBook
。
为了使子类可见,您需要将这些成员protected
而不是private
。{/ p>
另一种选择是将成员字段保留为私有,并添加受保护或公共访问方法以允许读取值。例如:
public:
string getAuthor()
{
return author;
}
我还会评论我不明白你为什么要使用this->
来访问你班级的成员。没有必要,通常最好省略它。
在没有看到你的家庭作业的情况下,我不能100%确定如何制作
的要求成员变量和属性是私有的
我的猜测是你的任务是覆盖allInfo()
。系统会要求您扩展返回的string
以包含基类实现中包含的所有信息,并添加更多信息。
您当前的尝试只是复制了Book::allInfo()
中的代码。这就是问题所在。为了使其起作用,派生类需要访问私有成员。你不能这样做。因此,您的解决方案必须涉及在基类上调用allInfo()
,然后附加到基类实现返回的字符串。
由于这是作业,我将不再为你实现这一点!
答案 1 :(得分:2)
让您的成员protected
通过派生类访问它们:
protected:
string title;
string author;
否则,它们对派生类是不可见的。
Private and Protected Members:
所有人都可以访问A类的公共成员。
在A的代码之外无法访问受保护的 A类成员, 但可以从A。
派生的任何类的代码访问 在A的代码之外无法访问A类的私有成员, 或者来自A。
的任何类的代码
如果您想让他们private
,则另一种方法是为他们创建protected
或public
访问方法。
答案 2 :(得分:1)
您应该将private
成员转换为:
protected:
string title;
string author;
这样子类可以访问它们。