ParentClass是ChildClass无法访问的基础

时间:2015-12-05 15:00:17

标签: c++ inheritance

我在c ++中编写以下代码但是我得到了一个无法访问的类型错误,但是当我公开继承子类时,一切顺利。我搜索过这个问题,但没有得到任何结果。 请帮助我这样做,这是我的任务,我必须私下继承这些课程。

#include<iostream>
using namespace std;
class publication
{
    private:
    string name;
    int id;
    public:
    virtual void getdata()
    {
        cout<<"Enter Name: ";
        cin>>name;
        cout<<"Enter ID: ";
        cin>>id;        
    }
    virtual void putdata ()
    {
        cout<<name;
        cout<<id;       
    }

};
class book: private publication
{
    private:
    int pages;
    public:
    void getdata()
    {
        publication::getdata();
        cout<<"Enter Pages: ";
        cin>>pages; 
    }
    void putdata ()
    {
        publication::putdata();
        cout<<pages;
    }
};
class tape: private publication
{
    private:
    float ptime;
    public:
    void getdata()
    {
        publication::getdata();
        cin>>ptime;
    }
     void putdata ()
    {
        publication::putdata();
        cout<<time;
    }
};
int main()
{
    publication *ptr[2];

            ptr[0] = new book;
            ptr[0]->getdata();
            ptr[0]->putdata();

            ptr[1] = new tape;
            ptr[1]->getdata();
            ptr[1]->putdata();
}

4 个答案:

答案 0 :(得分:0)

您正在使用私有继承。这意味着您继承了超类的字段和方法,但您只能从类本身或其友元类和函数中访问它们。其他函数甚至不知道继承存在,并且可能不像子类的实例那样使用子类。

您正在使用main中的子类。您可以创建子类类型的新对象,但随后(隐式)将它们转换为指向超类的指针。由于main不是子类的友元函数,因此不允许使用子类,就好像它是基类一样。因此编译器会给你一个错误。

在这种情况下使用公共继承似乎是正确的。由于所有函数都可能知道“book”和“tape”是“publication”的子类。

答案 1 :(得分:0)

编译器是正确的:指向类型book和类型tape的对象的指针无法转换为publication类型对象的指针,因为publication是私有基础。如果你需要使用私有基础,那么你需要在代码的其余部分做一些不同的事情,但是在代码应该做什么的问题上没有任何暗示,所以在这里真的不可能再说些什么了。

答案 2 :(得分:0)

当你在子类中继承时,这意味着父类的所有函数和数据也属于子类。因此,您应该使用this-&gt; getdata not publication :: getdata调用getdata函数。继承总是令我难以置信,所以我不是百分百肯定。但我相信它有效。

答案 3 :(得分:0)

我做到了。  可以通过制作 book 类的主要功能朋友和 tape 类来完成。我们现在不必公开继承课程。