class Book {
public:
string title;
int ID;
virtual void S () = 0;
};
class Narnia : public Book {
public:
int NarniaParts;
virtual void S () {}
};
class HP : public Book {
public:
int HPparts;
virtual void S () {}
};
int main ()
{
Book * s = new Narnia;
s-> //THIS IS WHERE THE PROBLEM IS
return 0;
}
所以我用一个超类书和两个Narnia和HP子类编写了这段小代码。当我做的时候
Book * s = new Narnia;
我的“s->”无法访问Narnia“NarniaParts”类的成员函数。它可以访问超类Book(标题,ID和S)的所有成员,但不能访问Narnia类对象的成员NarniaParts。有人可以解释为什么我s->无法访问NarniaParts?谢谢!
答案 0 :(得分:2)
无法从基指针访问派生类函数(除非使用虚函数)。在使用派生类函数之前,需要强制转换为Narnia*
。例如:
Narnia* n=dynamic_cast<Narnia*>(s);
s
和n
将指向同一个对象,但在使用n
时,您可以访问Narnia中的派生类函数。如果投射失败,n
将等于NULL
。
答案 1 :(得分:1)
这是因为编译器在运行时之前不知道s
是Narnia
,因此,它不会让您像s
那样对待Narnia
在编译期间,除非您明确告诉它s
是Narnia
(演员)
你正在向后做多态。
您想要做的是在BookParts
类中创建一个名为Book
的虚拟方法,并让每个派生类覆盖BookParts
方法,而不是使用自己的方法