2017-09-19 20 views
2

私は基底クラスと2つの派生クラスを持っています。派生クラスには一般的なメソッドがあります。例えば、activate()またはinit()などはわずかに異なる方法で実装されています。ですから、私はactivate()init()を純粋な仮想にします。派生クラスの仮想メソッドのデフォルトの実装

次に、派生クラスの90%がさまざまな方法で使用する方法があります。doSomething()他の10%はその機能を必要としません。

doSomething()を継承するのは合理的な習慣ですか?

ベースクラス:

class base { 
public: 
virtual void activate() = 0; 
virtual void init() = 0; 
virtual void doSomething(){ /* internal log that the function is not implemented */ }; 
}; 

と派生クラス:

class derivedA: public base { 
public: 
virtual void activate() override { /* activate A */ }; 
virtual void init() override { /* init A */ }; 
virtual void doSomething() override { /* do something in A */ }; 
}; 

//class derivedB to class derivedI like class derivedA 

class derivedJ: public base { 
public: 
virtual void activate() override { /* activate J */ }; 
virtual void init() override { /* init J */ }; 
// doSomething() is not overriden and the implementation of base is used 
}; 

が、これはそれを行うための可能な方法ですまたは多分モデリングに問題がありますか?

+0

はい。 [vtable](https://en.wikipedia.org/wiki/Virtual_method_table)-s(すべての警告でコンパイルしてください)についての良い[C++プログラミングマニュアル](http://stroustrup.com/Programming/)をお読みください。デバッグ情報( 'g ++ -std = C++ 11 -Wall -Wextra -g' witrh [GCC](http://gcc.gnu.org)...)は、デバッガでコードをステップバイステップで実行します。 –

+0

推奨読書:[インタフェース分離原理](https://en.wikipedia。org/wiki/Interface_segregation_principle) –

+0

純粋仮想関数の定義を含めることが*可能*であることに注意してください。それは明示的なスーパーコールのためだけに便利です。 – o11c

答えて

3

モデリングに問題がありますか?

間違いなく!

derivedJbaseから継承しているため、doSomething()が使用されることを期待しています(どの実装でも問題ありません)。

しかし、あなたのderivedJクラスがこのメソッドを提供しないようにするため、モデリングを変更する必要があります。

素朴な解決策は、このように、その機能を削除し、あなたのbaseクラスを変更することです:doSomething()その後、baseに由来する少なくとも1つのクラスがdoSomething()を実装するために、概念的には、必要としない場合は

class base { 
public: 
    virtual void activate() = 0; 
    virtual void init() = 0; 
}; 
0

べきbaseのインターフェースの一部ではないので、別のインターフェースに入る必要があります。

つまり、doSomething()は別の抽象基本クラスの一部である必要があります。base2とします。 doSomething()(またはなければならない)activate()init()は別に使用することができなかった場合

は、baseからbase2を導出しbase2からderivedIderivedAを導出し、baseからderivedJ

それは、別のクラスとしてそれをbase2残し、basebase2の両方からderivedIderivedAを導出し、唯一baseからderivedJを引き出すことができれば。

関連する問題