ParentClass是ChildClass的一个不可访问的基

ParentClass is an inaccessible base of ChildClass

本文关键字:一个 访问 ChildClass ParentClass      更新时间:2023-10-16

我正在用c++编写以下代码,但我遇到了一个不可访问的类型错误,但当我与parent一起公开继承子类时,一切都很顺利。我搜索过这个问题,但没有得到任何结果。请帮我做好这件事,这是我的任务,我必须私下继承课程。

#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();
}

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

当您在Childclass中具有继承时,这意味着Parentclass的所有函数和数据也属于child。因此,您应该使用这个->getdata而不是publication::getdata来调用getdata函数。继承总是让我感到困惑,所以我不能百分之百确定。但我相信它是有效的。

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

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

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

我已经完成了。这可以通过使书籍类和磁带级的主要功能成为朋友来实现。我们现在不必公开继承这些类。