3

メソッドの動作方法が異なることを除いて、共通の基本クラスを共有するクラスがいくつかあります。したがって、以下の例では、加算器と乗算器は、計算の実行方法を除いて同じです。

その場で「a」を乗数に変更する方法はありますか? 派生クラスを相互に変換するメソッドを実装する必要がありますか? たとえば、次のようなもの

a = a.asMultiplier()?

以下のコードでわかるように、乗算器に reinterpret_cast を試みましたが、うまくいきませんでした。それでも、加算器のように動作します。(gcc OS X v4.2.1)

#include <iostream>


class Base {
protected:
    int a,b;    
public:
    Base(int a, int b) {
        this->a = a;
        this->b = b;
    }  
    virtual ~Base() { }    
    virtual int calculate() = 0;
};


class Adder : public Base {    
public:
    Adder(int a, int b) : Base(a, b) {

    }      
    int calculate() {
        return this->a + this->b;
    }
};


class Multiplier : public Base {    
public:
    Multiplier(int a, int b) : Base(a, b) {    
    }  

    int calculate() {
        return this->a * this->b;
    }
};



int main() {

    Base* a = new Adder(3,4);
    Base* m = new Multiplier(3,4);

    std::cout << "Adder gives " << a->calculate() << std::endl;
    std::cout << "Multiplier gives " << m->calculate() << std::endl;

    a = reinterpret_cast<Multiplier*>(a);

    std::cout << "Now adder gives " << a->calculate() << std::endl;

    delete a;
    delete m;
    return 0;
}
4

4 に答える 4

7

これを解決するために私が思いついた最善のことは、コピーコンストラクターを実装して、基本クラスを取得することです。

class Multiplier : public Base {    
public:
    Multiplier(int a, int b) : Base(a, b) {    
    }  

    explicit Multiplier(const Base& iBase) : Base(iBase.a, iBase.b) {    
    }  

    int calculate() {
        return this->a * this->b;
    }
};

しかし、私はここで最も高度な C++ 開発者ではないので、正しくないか、他の人がより良いアイデアを持っているかもしれません:)

于 2012-06-08T15:16:54.330 に答える
5

オブジェクトのデータをその操作から切り離すことを提案します。このようにして、データを追い越して、あるオブジェクトを別のオブジェクトから簡単に構築できます。したがって、「変換」は次のようになります。Multiplier m = new Multiplier(a);

あなたが求めている方法でそれを行うことはC++では不可能です。

于 2012-06-08T15:15:09.217 に答える
4

これには、データを操作するユーティリティクラスが必要になるように思われます。基本クラスを、データを格納し、データを明示的になどのクラスに渡すことだけを目的としたDataクラスに変更しAdderますMultiplier

上記のリファクタリングの後で意味がある場合は、ユーティリティクラスで継承を引き続き使用できます。この場合、ベースはデータ自体ではなく、データオブジェクトでも動作します。

于 2012-06-08T15:15:39.253 に答える
2

デザインを変更することはおそらく良い考えです。一般に、基本クラスと派生クラスがデータだけでなく動作に関して共有するある種の共通点がある場合は、継承を使用することをお勧めします。直接的にはあまり有益なアドバイスではありませんが、オブジェクト指向設計の原則に関する本を何冊か読むことをお勧めします。自分のやり方で型をキャストしようとしても、本当に意味がありません。

于 2012-06-08T15:21:25.420 に答える