1

このクラスがある場合:

class FooBar {
    public:
        FooBar(int qux);
        void bar();

        void foo1();
        void foo2();
        //...
        void foo99();
}

barでメソッドを上書きFooBarし、他のすべてのfooメソッドを再度定義せずに使用できるようにするにはどうすればよいですか?

編集:

私はこのように使いたい:

FooBar2 baz(1); // call the constructor of FooBar, FooBar(1)
baz.foo1(); //call method foo1 of original FooBar
baz.bar(); // call method bar of FooBar2

ヘッダーや FooBar の実装は編集したくありません

コンストラクター関数がから元のコンストラクター関数を呼び出すようにすることも可能FooBarですか?

4

3 に答える 3

2

bar virtualオーバーライドはメソッドにのみ適用されるため、作成しvirtualます。

FooBar次に、 のためだけに新しい実装を拡張して提供しbarます。

class FooBar {
    public:
        virtual void bar();

        void foo1();
        void foo2();
        //...
        void foo99();
};

class FooBarDerived : FooBar
{
    public:
        void bar();
};
于 2012-08-24T10:14:00.743 に答える
2

継承。

class FooBar
{
public:
    virtual void bar() { ... default implementation ... }
    void foo1();
    void foo99();
}


class FooBarVariation : public FooBar
{
public:
    virtual void bar() { ... different implementation ... }
}

FooBarVariationのように動作FooBarしますが、 の実装が異なりますbar()

于 2012-08-24T10:16:03.957 に答える
1

必要なのはFunction Hidingであり、 overriddingではありません。オーバーライドは、キーワードが含まれて
いる場合にのみ適用されます。virtual

派生クラスでオーバーロードするメソッドを再定義するだけで問題ありません。

class YourClass: public FooBar 
{
    public:
       void bar(){}
};

クラスYourClassオブジェクトは のすべてのメソッドにアクセスできますFooBar。これらはメソッドであり、クラスはそれから公にpublic派生しているからです。YourClass::bar() FooBar::bar()

編集:
編集された質問は、関数の非表示が実際に必要なものであることを明確にします。
これは、要件を達成する関数隠蔽のオンラインデモです。

コンストラクター関数がから元のコンストラクター関数を呼び出すようにすることも可能FooBarですか?

メンバー初期化リストを使用して、派生クラス コンストラクターを介して適切な基本クラス コンストラクターを呼び出すことができます。

よく読んでください:
コンストラクターのこの奇妙なコロンメンバー (" : ") 構文は何ですか?

于 2012-08-24T10:14:02.397 に答える