派生类中虚方法的默认实现

时间:2017-09-19 05:30:46

标签: c++ function class oop inheritance

我有一个基类和几个派生类。派生类具有通用方法,例如activate()init(),它们以稍微不同的方式实现。所以,我让activate()init()纯虚拟。

然后,像doSomething()这样的方法,90%的派生类以不同的方式使用。其他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
};

这是一种可行的方法,还是建模可能存在问题?

2 个答案:

答案 0 :(得分:3)

  

建模可能有问题吗?

当然!

我希望derivedJ继承自base,然后才会使用doSomething()(这与实现无关)。

但是,您希望derivedJ类不提供此方法,因此您应该更改建模。

一个天真的解决方案是修改你的base类,删除该功能,如下所示:

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

答案 1 :(得分:0)

如果从base派生的至少一个类在概念上不需要实现doSomething(),那么doSomething()不应该是base的接口的一部分,并且所以它需要进入另一个界面。

也就是说,doSomething()应该是另一个抽象基类的一部分,称之为base2

如果doSomething()可以(或不应该)与activate()init()分开使用,则从base2派生base并导出derivedA来自derivedI的{​​{1}}和来自base2的{​​{1}}。

如果可以,请将derivedJ作为单独的类保留,并从basebase2派生derivedAderivedI,并且只导出base 1}}来自base2