0

所以我做了这门课:

    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()在另外两个类中介绍 -function 一个叫做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 AudioBook::allInfo()'中:| 包括\Book.h|41|错误:'std::string Book::title' 是私有的| mningsuppgiftIIB\src\AudioBook.cpp|27|错误:在此上下文中| 包括\Book.h|42|错误:'std::string Book::author' 是私有的| mningsuppgiftIIB\src\AudioBook.cpp|27|错误:在此上下文中| ||=== 构建完成:4 个错误,0 个警告 ===|

HardcoverBook它根本没有抱怨这一点,这很奇怪。

我的问题:

  1. 我该怎么做才能完成这项工作?(即使两个类都能够以allInfo()自己的方式使用该功能)

  2. 为什么它不能这样工作?

编辑:这是我正在做的一些作业,其中一个要求是使成员变量和属性私有。所以受保护确实有效,为那些家伙表示敬意,但我会添加另一个奖励问题:

  1. 如何使其与私有成员变量一起使用?
4

3 回答 3

3

title成员authorprivate。这意味着它们在子类中不可见,例如AudioBook.

为了使它们对子类可见,您需要使这些成员protected而不是private.

另一种选择是将成员字段保留为私有,并添加受保护或公共访问方法以允许读取值。例如:

public:
    string getAuthor()
    {
        return author;
    }

我还要评论说,我不明白您为什么要this->用来访问班级成员。没有必要这样做,通常最好直接省略它。


没有看到你的家庭作业,我不能 100% 确定要做什么

成员变量和属性是私有的

我的猜测是你的任务是覆盖allInfo(). 您被要求扩展string返回以包含基类实现包含的所有信息,并添加更多信息。

您当前的尝试只是复制Book::allInfo(). 这就是问题所在。为了使其工作,派生类需要访问私有成员。而且你不被允许这样做。因此,您的解决方案必须涉及调用allInfo()基类,然后附加到基类实现返回的字符串。

由于这是家庭作业,因此我不会为您执行此操作!

于 2013-03-14T19:37:15.913 回答
2

让您的成员protected通过派生类访问它们:

  protected:
            string title;
            string author;

否则,它们对于派生类是不可见的。

私人和受保护的成员

A 类的公共成员可供所有人访问。

类 A 的受保护成员不能在 A 的代码之外访问,但可以从从 A 派生的任何类的代码中访问。

类 A 的私有成员不能在 A 的代码之外或从 A 派生的任何类的代码中访问。

如果您想离开它们private,另一种方法是为它们创建protectedpublic访问方法。

于 2013-03-14T19:37:32.093 回答
1

您应该将private成员转换为:

protected:
    string title;
    string author;

这样子类可以访问它们。

于 2013-03-14T19:37:59.630 回答