5

基本クラス ポインターを使用して、基本クラスで定義されていない派生クラス関数を呼び出したいです。しかし、これは常にエラーを発生させます:

error C2039: ‘derivedFunctionName’ : is not a member of ‘BaseClass’

どうすればこれを回避できるか知っていますか?

ありがとう、

4

3 に答える 3

14

基本クラスへのポインターを使用して、派生クラスにのみ表示されるメンバーを呼び出すことはできません。最初に派生型へのポインターにキャストする必要があります(おそらくを使用dynamic_cast)-そうしないと、コンパイラーはメソッドが存在することすら認識しません。

次のようになります。

void someMethod(Base* bp) {
    Derived *dp = dynamic_cast<Derived*>(bp);
    if (dp != null)
        dp->methodInDerivedClass();
}
于 2013-07-07T17:04:42.267 に答える
5

1 つの方法は、基本クラスで関数を作成virtualし、派生クラスでオーバーライドすることです。基本クラスで関数を定義する必要はありませんが (可能ですが)、基本クラスvirtual void foo() = 0; で実装を提供したくない場合は、基本クラスで純粋仮想構文を使用できます。

これにより、派生クラスでオーバーライドし、基本クラス ポインターを介して基本クラスで呼び出すことができます。これは「ポリモーフィズム」として知られています。

その時点で実際に派生クラス ポインターであることが確実な場合は、実行時に派生型にキャストすることもできます。そうでない場合は、クラッシュします。

于 2013-07-07T17:13:39.863 に答える
2

メソッドが仮想である限り、基底クラスへのポインターを介して派生クラス メンバーを呼び出すことができます。それがポリモーフィズムです。

これを機能させるには、基本クラスで仮想メソッド (おそらく純粋仮想) を宣言し、派生クラスでそれをオーバーロードする必要があります。

基本メソッドから派生メンバーを呼び出すと、問題が発生することに注意してください。これが意味をなさない場合は、ARM または Meyers を読んでください。

于 2013-07-07T17:19:42.003 に答える