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

そこで、1 つのスーパークラス Book と 2 つのサブクラス Narnia と HP を使用して、この小さなコードを作成しました。私がする時

Book * s = new Narnia;

私の "s->" はクラス Narnia "NarniaParts" のメンバー関数にアクセスできません。スーパー クラス Book のすべてのメンバー (タイトル、ID、および S) にアクセスできますが、クラス Narnia のオブジェクトのメンバー NarniaParts にはアクセスできません。NarniaParts にアクセスできない理由を誰か説明してもらえますか? ありがとうございました!

4

2 に答える 2

2

ベース ポインターから派生クラス関数にアクセスすることはできません (仮想関数を使用しない限り)。Narnia*派生クラス関数を使用するには、キャストする必要があります。例えば:

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

sn同じオブジェクトを指しますが、使用nすると Narnia の派生クラス関数にアクセスできます。キャストが失敗した場合、nと等しくなりNULLます。

于 2013-05-17T19:38:04.523 に答える
1

これは、コンパイラが実行時までそれをs認識していないためです。したがって、(キャスト)NarniasNarniasNarnia


ポリモーフィズムを逆に行っています。

あなたがしたいことは、クラスで呼び出される仮想メソッドを作成しBookParts、独自のメソッドを持つ代わりにBook、各派生クラスにメソッドをオーバーライドさせることです。BookParts

于 2013-05-17T19:38:26.897 に答える