2013-01-11 11 views
12

この質問は似ていますが、クラスの中から機能を呼び出すことについてです。その場合はCan I call a base class's virtual function if I'm overriding it?C++のクラスの外部で基本関数を呼び出す方法はありますか?

、あなたはオーバーライドされた定義を呼ぶであろう、Base::function()代わりのfunction()を指定すると思います。

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

Base(derived_object).function() 

Base*として& derived_objectをキャストして->function()を呼び出すために、ここで行うには適切なものですか?

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

derived_ptr->Base::function(); 

作品だけで罰金:

+1

仮想関数のポイントは、オブジェクトのコンパイル時の型とは関係なく、実行時に解決されるということです。 'dynamic_cast'は確実に動作しません。 –

+0

なぜあなたはしたいですか?関数が派生クラスの一部であり、ベースクラスでもある場合は、ベースクラスを呼び出すときにおそらく何か間違っているでしょう。これを解決するより良い方法は、派生クラスによって呼び出されることを目的としたベースクラス内の別の関数を作成し、そのベースクラスがその関数を呼び出すようにすることです。 –

+0

下記の@Omnifariousへのコメントをご覧ください。 – user

答えて

18

はおそらく、クラスのメンバ関数へのポインタを使用したいderived_object.Base::function();

+0

その標準ですか?もしそうなら、そのトリックを行います。 – user

+1

@Oliver:はい、標準です。 – Mankarse

+4

@Oliver class :: function()は、メンバ関数の「フルネーム」です。あなたが呼び出した関数のクラスを指定しなかった場合は、 'default'(あなたのケースで派生したもの)です。 – Eric

9

私は構文を信じています。あなたがなぜあなたのクラスに含まれていない関数でこれをしたいのか、本当に疑問に思っています。特にfunctionが仮想関数である場合

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

+1

ありがとうございます。私は、レポートを作成するBaseオブジェクトと、ベースレポートに余分な情報を含むレポートを生成するDerivedオブジェクトを持っています。そこでBase :: generate_reportを使ってベースレポートを作成し、追加情報をコピーします。これは、訪問者パターン(懸念のより良い分離)を使用してクラス外で行われます。BaseReportはBaseで構築され、DerivedReportはDerivedで構築されます。ピー! – user

0

を試してみてください。これらは、必要に応じてさまざまな基本クラス関数をポインタにマップする機能と、変数または関数パラメータとして使用する機能を提供します。

メンバ関数へのポインタのための構文は

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

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

のように見えるこれらのものを使用するための注意事項のリストは、(それらを使用する方法については、オンラインたくさんある長期マイルでの回答のほとんどは、 「しない」)。しかし、彼らはあなたに明白に結合し、基本クラスのメンバ関数を呼び出す方法を提供します。

+0

そのtypedef構文が間違っています。 – aschepler

関連する問題