18

この質問は似ていますが、クラス内から関数を呼び出すことについてです。オーバーライドしている場合、基本クラスの仮想関数を呼び出すことはできますか?

その場合、オーバーライドされた定義を呼び出すBase::function()代わりにを指定します。function()

しかし、クラスの外でこれを行う方法はありますか?私のクラスはコピーコンストラクターを定義していないので、基本クラスとしてキャストする方法を理解できませんでした。

Base( derived_object ).function()

ここでキャスト& derived_objectBase*てから呼び出すのは適切->function()ですか?

あなたの洞察に感謝します。

4

3 に答える 3

25

試すderived_object.Base::function();

于 2013-01-12T00:08:11.023 に答える
11

私は構文を信じています:

derived_ptr->Base::function();

うまく動作します。クラスの一部ではない関数でこれを実行したい理由は本当に疑問ですが。特にfunction仮想関数の場合は特にそうです。

それが疑わしい考えである理由は、その表記法を使用するものが何であれ、クラスの継承階層に依存するようにしているからです。また、関数は通常、何らかの理由でオーバーライドされます。そして、あなたはこの構文を使用することによってそれを回避しています。

于 2013-01-12T00:03:40.133 に答える
0

クラスのメンバー関数へのポインタを使用することをお勧めします。これらは、必要に応じてさまざまな基本クラス関数をポインターにマップする機能と、それを変数または関数パラメーターとして使用する機能を提供します。

メンバー関数へのポインターの構文は次のようになります。

class Base
{
public:
    virtual bool Function();
    virtual bool OtherFunction();
};

typedef bool (Base::*)() BaseFunc;

これらのものを使用するための警告のリストは1マイルの長さです-それらを使用する方法についてはオンラインでたくさんあります(答えのほとんどは「しないでください」です)。ただし、基本クラスのメンバー関数に明確にバインドして呼び出す方法を提供します。

于 2013-01-12T04:27:40.597 に答える