虚函数错误?

时间:2013-03-14 19:35:16

标签: c++ compiler-errors

所以我做了这个课:

    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中,它并没有抱怨这一点,奇怪的是。

我的问题:

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

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

  3. 编辑: 这是我正在做的一些功课,其中一个要求是将成员变量和属性设为私有。所以受保护确实起作用,对那些人来说是赞誉,但我会添加另一个红利问题:

    1. 如何使用私有成员变量?

3 个答案:

答案 0 :(得分:3)

titleauthor成员为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,则另一种方法是为他们创建protectedpublic访问方法。

答案 2 :(得分:1)

您应该将private成员转换为:

protected:
    string title;
    string author;

这样子类可以访问它们。