我在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();
}
答案 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 类来完成。我们现在不必公开继承课程。