【问题标题】:Default implementation for virtual method in derived class派生类中虚方法的默认实现
【发布时间】:2018-02-27 18:29:33
【问题描述】:

我有一个基类和几个派生类。派生类具有通用方法,例如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
};

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

【问题讨论】:

  • 是的。请阅读良好的C++ programming book,阅读有关vtable-s 的内容,(使用所有警告和调试信息进行编译(g++ -std=c++11 -Wall -Wextra -gGCC...),在调试器中逐步运行您的代码以了解什么是正在发生。
  • 不确定是否有帮助,但请注意可能包含纯虚拟函数的定义。不过,它只对显式超级调用有用。
  • @BasileStarynkevitch 你确定你评论的问题是正确的吗?这是一个与语言无关的问题。此处与 C++ 特定的实现细节高度无关。
  • Visitor_pattern 可能会让您感兴趣。

标签: c++ function class oop inheritance


【解决方案1】:

是不是建模有问题?

绝对!

我希望既然derivedJ 继承自base,那么doSomething() 就应该被使用(无论哪种实现都无关紧要)。

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

一个天真的解决方案是修改您的 base 类,删除该函数,如下所示:

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

【讨论】:

    【解决方案2】:

    如果从base 派生的至少一个类在概念上不需要实现doSomething(),那么doSomething() 不应该是base 接口的一部分,因此它需要进入另一个接口.

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

    如果doSomething() 可以(或不应该)与activate()init() 分开使用,则从base 派生base2 并从derivedA 派生derivedAderivedI 和@987654335 @来自base

    如果可以,请将base2 保留为单独的类,并从basebase2 派生derivedAderivedI,并且仅从base 派生derivedJ

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-02
      • 1970-01-01
      • 2016-10-12
      • 2018-10-14
      • 1970-01-01
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多