0
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;
}

所以我用一个超类 Book 和两个子类 Narnia 和 HP 编写了这段小代码。当我做

Book * s = new Narnia;

我的“s->”无法访问纳尼亚“NarniaParts”类的成员函数。它可以访问超类 Book 的所有成员(标题、ID 和 S),但不能访问类 Narnia 对象的成员 NarniaParts。有人可以解释为什么我 s-> 无法访问 NarniaParts 吗?谢谢!

4

2 回答 2

2

从基指针访问派生类函数是不可能的(除非您使用虚函数)。您需要先转换为Narnia*才能使用派生类函数。例如:

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

s并且n将指向同一个对象,但使用时n您可以访问纳尼亚中的派生类函数。如果强制转换失败,n将等于NULL

于 2013-05-17T19:38:04.523 回答
1

这是因为编译器直到运行时才知道这s是 a ,因此,除非您明确告诉它是 a (casting) ,否则Narnia它不会让您在编译期间s像 a 一样对待NarniasNarnia


你正在向后做你的多态性。

您似乎想要做的是BookParts在您的Book类中调用一个虚拟方法,并让每个派生类覆盖该BookParts方法,而不是拥有自己的方法。

于 2013-05-17T19:38:26.897 回答