在基类中混合虚拟和非虚函数是不好的编程习惯吗?

use*_*952 4 c++ polymorphism virtual class subclass

我有一个基类Base,我声明了几个多态的子类.一些基类的函数是纯虚函数,而其他函数直接由子类使用.

(这都是用C++编写的)

例如:

class Base
{
protected:
     float my_float;
public:

    virtual void Function() = 0;

    void SetFloat(float value){ my_float = value}
Run Code Online (Sandbox Code Playgroud)

}

class subclass : public Base
{

  void Function(){ std::cout<<"Hello, world!"<<std::endl; }
}

class subclass2 : public Base
{

  void Function(){ std::cout<<"Hello, mars!"<<std::endl; }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,子类将依赖于设置"my_float"的函数的基类,但对于其他函数将是多态的.

所以我想知道这是不是很好的做法.如果你有一个抽象的基类,你应该把它完全抽象,还是可以做这种混合方法?

Mar*_* J. 5

这是一种常见的做法.事实上,一些众所周知的设计模式依赖于此,例如模板方法模式.简而言之,这允许您将通过类层次结构描述的行为的某些方面指定为不变量,同时让该行为的其他方面根据您在给定点上引用的特定实例类型而有所不同.

是否好的取决于您的确切用例:您是否有必要在所有基类之间共享浮动成员数据存储的实现?由于派生类不my_float以任何方式依赖,您发布的示例有点难以回答,但有很多情况下这是有道理的,并且是分割类层次结构职责的好方法.

即使在跨类共享细节实现的情况下,您还有其他几个选项,例如使用组合来共享功能.与通过组合共享此功能相比,通过基类共享功能通常可以减少冗长,因为它允许您共享实现和接口.为了说明,与使用组合的替代方案相比,您的解决方案具有更少的重复代码:

class DataStorage {
private:
  float data_;
public:
  DataStorage()
  : data_(0.f) {
  }

  void setFloat(float data) {
    data_ = data;
  }
};

class NotASubclass1 {
private:
  DataStorage data_;
public:
  void SetFloat(float value){ data_.setFloat(value); }  
  ...
}

class NotASubclass2 {
private:
  DataStorage data_;
public:
  void SetFloat(float value){ data_.setFloat(value); }  
  ...
}
Run Code Online (Sandbox Code Playgroud)