2

このコードを見てください。それは私がやりたいことの基本的な概念を反映しているだけです:

#include <iostream>
using namespace std;

class Base
{
public:
    Base() 
    {
        /* Some code I want to reuse */
        Redefined(); 
    }
    virtual ~Base() {}
    void Redefined() { val = 10; }
    int val;
};

class Derived : public Base
{
public:
    Derived() : Base() {}
    ~Derived() {}
    void Redefined() { val = 25; }
};

int main()
{
    Base* check = new Derived();

    cout << check->val << endl;

    system("pause");
    return 0;
}

valobject のプロパティcheckを 10 ではなく 25 にしたい。

ご覧のとおり、2 つのクラスがあります。Baseクラスコンストラクターにはいくつかの複雑な機能があり、クラスのコンストラクターにもそれを持たせたいと思っDerivedています。Redefinedコンストラクターを完全に書き直す必要がないように、派生関数を変更するにはどうすればよいですかDerived(実際には、基本クラスのコンストラクター コード全体をコピーして貼り付け、コードの 1 行を置き換えるだけです -Redefined関数の更新バージョン)。

4

2 に答える 2

2

そのように関数を実際にオーバーライドすることはできません。通常、仮想関数を使用できますが、コンストラクターでは思いどおりに動作しません。

より良い方法は、必要な値をBaseコンストラクターに渡すことです。

class Base
{
public:
    Base(int init_val = 10) 
    {
        /* Some code I want to reuse */

        val = init_val;
    }
    virtual ~Base() {}

    int val;
};

class Derived : public Base
{
public:
    Derived() : Base(25) {}
    ~Derived() {}

};

そうすれば、派生クラスは選択した値を基本クラスに渡すことができます。

于 2013-02-09T09:42:49.810 に答える
0

上記のコメントに基づいて:

実際、正しい解決策は、「インターフェイス」型のベースクラス (つまり、純粋な仮想関数を持つベースクラスであり、派生クラスが実際に正しい動作を実装する) を用意し、各クラスに独自の DirectX の構築を処理させることだと思います。バッファ。たとえば、さまざまな方法でバッファーを構築する 2 ~ 3 個の異なる派生クラスが必要であることに気付く場合があり、それらから実際の作業を行うクラスを派生させます。それが理にかなっていることを願っています。

または、バッファーを構築できるように、十分なパラメーターを基本クラスに渡します。しかし、最初の提案はより良い選択だと思います。

于 2013-02-09T13:48:54.373 に答える