1

classsubから継承するクラスがありsuperます。どちらも関数を定義しますvoid function()(したがって、 の関数は の関数をsubオーバーライドしますsuper)。ポインターを作成し、superそれを の新しいインスタンスに割り当てますsub。次に、ポインターを介して function()のインスタンスを呼び出します。ただし、 の関数ではなく、 の関数が呼び出されます。ではなく、で関数を呼び出してほしい。どうすればいいですか?subsupersupersubsubsuper

#include <cstdio>  

class super {  
    public:
    void function() {  
        printf("Super\n");  
    }  
};  

class sub: public super {  
    public:  
    void function() {  
        printf("Sub\n");  
    }  
};  

int main() {  
    super *p;  
    p = new sub;  
    p->function();  
    return 0;  
}
4

3 に答える 3

0
class super {  
    public:
    virtual void function() {  
        printf("Super\n");  
    }  
};
于 2013-03-10T05:28:38.717 に答える
0
  • 基本クラスのポインターを使用して派生クラスの関数を呼び出すには、関数のオーバーライドと呼ばれる概念を実装する必要があります。
  • しかし、あなたの場合、関数のオーバーライドではなく、関数の非表示を実装しました。
  • 関数をオーバーライドするには、派生クラスと基本クラスの両方が同じ関数シグネチャを持ち、基本クラスの関数宣言がvirtualキーワードで宣言されている必要があります。
  • 基本クラス宣言でキーワードを使用するvirtualと、メモリ内の仮想テーブルと、クラス チェーンのほとんどの派生関数への呼び出しが処理されます。

さらに理解を深めるために、以下をお読みください。

于 2013-03-10T05:31:04.203 に答える
0

宣言は次のようにする必要があります。

virtual void function()

私はC ++に慣れていませんが、基本的に関数が仮想でない場合、コンパイラは、ポインターがスーパーへの場合、function()呼び出しはsuper::function()に行くというあなたの言葉を受け入れます。Virtual は、代わりに正しいものを見つけてほしいと伝えます。実際には、これは代わりに vtable を作成し、間接的なルックアップを行うことを意味します。その場合、super* か sub* かは関係ありません。どちらも vtable を持ち、vtable はオブジェクトの実際の型の正しいバージョンの function() を指すためです。

于 2013-03-10T05:19:09.510 に答える