我有一个基类和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
}
}
在所有继承的类中都有一个默认退出的函数,可以声明为纯虚函数。它是析构函数。析构函数是纯虚拟时唯一需要主体的函数。
class base {
...
virtual ~base() = 0; // destructor is pure
...
};
base::~base() = default; // destructor body
注意,如果一个类是基类,析构函数必须是
virtual
或protected
。所以在这里,你必须定义一个析构函数.
为了让你不能实例化
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;
}