无法在多态中访问子类的成员

时间:2013-05-17 19:35:50

标签: c++ inheritance polymorphism

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?谢谢!

2 个答案:

答案 0 :(得分:2)

无法从基指针访问派生类函数(除非使用虚函数)。在使用派生类函数之前,需要强制转换为Narnia*。例如:

Narnia* n=dynamic_cast<Narnia*>(s);

sn将指向同一个对象,但在使用n时,您可以访问Narnia中的派生类函数。如果投射失败,n将等于NULL

答案 1 :(得分:1)

这是因为编译器在运行时之前不知道sNarnia,因此,它不会让您像s那样对待Narnia在编译期间,除非您明确告诉它sNarnia(演员)


你正在向后做多态。

您想要做的是在BookParts类中创建一个名为Book的虚拟方法,并让每个派生类覆盖BookParts方法,而不是使用自己的方法