私は基底クラスと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
};
が、これはそれを行うための可能な方法ですまたは多分モデリングに問題がありますか?
はい。 [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)...)は、デバッガでコードをステップバイステップで実行します。 –
推奨読書:[インタフェース分離原理](https://en.wikipedia。org/wiki/Interface_segregation_principle) –
純粋仮想関数の定義を含めることが*可能*であることに注意してください。それは明示的なスーパーコールのためだけに便利です。 – o11c