【问题标题】:Virtual functions error?虚函数错误?
【发布时间】:2013-03-14 19:35:15
【问题描述】:

所以我做了这门课:

    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 有声书::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. 如何使其与私有成员变量一起使用?

【问题讨论】:

  • 使 string title;string author; 受保护字段
  • 其他人已经回答让他们受到保护。如果您想防止子类修改这些成员,您还可以考虑提供公共访问器。编辑:或者只使用您已经声明的访问器...
  • 我正在做这个作为家庭作业,其中一个要求是使成员变量和属性私有。可能应该在发布之前提到这一点。

标签: c++ compiler-errors


【解决方案1】:

titleauthor 成员是 private。这意味着它们在子类中不可见,例如AudioBook

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

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

public:
    string getAuthor()
    {
        return author;
    }

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


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

成员变量和属性是私有的

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

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

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

【讨论】:

  • 啊,好吧。我可以试试。我这样做是作为家庭作业,其中一项要求是使成员变量和属性私有。可能应该在发布之前提到这一点。
  • 你成功了。非常感谢。 =)
  • 听起来像是一个很好的练习,有很好的课程要教。应避免重复,因为除其他原因外,它使维护更加困难。如果您对某些代码有多个相同的不同实现,那么当您想要进行修改时,您必须找到(困难的部分)并更改(容易的部分)所有这些。
【解决方案2】:

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

  protected:
            string title;
            string author;

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

Private and Protected Members:

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

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

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

如果你想让他们留下private,另一种方法是为他们创建protectedpublic访问方法。

【讨论】:

    【解决方案3】:

    您应该将private 成员转换为:

    protected:
        string title;
        string author;
    

    这样子类可以访问它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多