要求基类中的方法被其所有子类重写

Require a method in a base class to be overridden by all of its subclasses

本文关键字:子类 重写 方法 基类      更新时间:2023-10-16

在C++中,是否可以要求基类中的方法被其所有派生类覆盖,而不使其成为纯虚拟方法?

#include <iostream>
using namespace std;
class BaseClass{
    public:
    int printStuff(){ //find some way to require all derived classes to override this method
        cout << "Printing some stuff";
    }
};
class DerivedClass: public BaseClass{
};
int main(){
    cout << "Hello World!";
    return 0;
}

我知道你说你不想使用纯虚函数,但是你可以使用纯虚函数,如果这是你想要做的,你仍然可以给方法一个定义(不确定你是否已经知道):

class BaseClass{
public:
    virtual int printStuff() = 0;
};
// give the pure virtual function an implementation
int BaseClass::printStuff() {
    cout << "Printing some stuff";
}
class DerivedClass: public BaseClass{
    // compiler error; DerivedClass must override printStuff
};
class DerivedClass2: public BaseClass{
public:
    int printStuff() {
        return BaseClass::printStuff(); // use the base class's implementation
    }
};

这取决于你所说的要求是什么意思。通常"require"意味着"除非完成否则无法编译"。如果这是你想要的,那么纯虚拟是唯一想要定义实现它的方法。如果您的意思是"程序除非完成,否则无法工作",那么您可以为虚拟方法提供默认实现,该方法确实会通知用户缺少该实现。

class BaseClass {
protected:
    virtual int printStuff () {
        std::cout << "Nothing to print, please override printStuff()."
                  << std::endl;
        return -1;
    }
};

当提供虚拟方法的实现时(即,虚拟方法未声明为0赋值),它不再是"纯"的。所以这种技术满足了你"不是纯虚拟方法"的要求,但它仍然是一个虚拟方法。

我假设你想要这个,因为你认为你的代码的某些部分需要实例化一个普通BaseClass。如果是这种情况,您可以考虑将BaseClass分为两部分。一个是"纯"接口,另一个是具有您在实例化它时实际将使用的东西。

class BaseObject {
    //...
};
class BaseClass {
protected:
    BaseObject base;
    virtual int printStuff () = 0;
};

因此,您将实例化BaseObject而不是BaseClass