当继承类对相同方法没有相同签名时,使基类抽象

问题描述 投票:0回答:2

我有一个基类和2个从基类继承的继承类。基类不应该被实例化,所以我想做一个抽象基类,但是2个继承类没有具有相同签名的共享函数(签名相似但不相同),所以它并没有成为一个整体在基类中创建一个纯虚函数很有意义,除非我只是创建一个虚拟虚函数并在继承类中定义它。还有另一种方法吗?

举个例子:

class base {
  public: 
    base() : i{0}, j{0} {}
    
    void compute_i() {
      // computes i
    }

  private:
    // declare some variables
    double i;
    double j;
}

class inherited1 {
  public:
    inherited1() = default;

    void compute_j(double val, double k) {
      // compute j here
    }
}

class inherited2 {
  public:
    inherited2() = default;

    void compute_j(double val) {
      // compute j here
    }
}

c++ inheritance abstract-class
2个回答
1
投票

在所有继承的类中都有一个默认退出的函数,可以声明为纯虚函数。它是析构函数。析构函数是纯虚拟时唯一需要主体的函数。

class base {
  ...
  virtual ~base() = 0;    // destructor is pure
  ...
};
base::~base() = default;  // destructor body

注意,如果一个类是基类,析构函数必须是

virtual
protected
。所以在这里,你必须定义一个析构函数.


0
投票

为了让你不能实例化

base
,只需声明
base
的构造函数
protected

class base {
  protected: 
    base() : i{0}, j{0} {}

  public:  
    void compute_i() {
      // computes i
    }

  private:
    // declare some variables
    double i;
    double j;
};

class inherited1 {
  public:
    inherited1() = default;

    void compute_j(double val, double k) {
      // compute j here
    }
};

class inherited2 {
  public:
    inherited2() = default;

    void compute_j(double val) {
      // compute j here
    }
};

int main ()
{
//  base b;              // does not compile
    inherited1 i1;
    inherited2 i2;
}

现场演示

© www.soinside.com 2019 - 2024. All rights reserved.