关于c ++:要求基类中的方法被其所有子类覆盖

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#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;
}


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
    }
};


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

1
2
3
4
5
6
7
8
class BaseClass {
protected:
    virtual int printStuff () {
        std::cout <<"Nothing to print, please override printStuff()."
                  << std::endl;
        return -1;
    }
};

当提供了一个虚拟方法的实现(也就是说,虚拟方法不是用0的赋值声明的)时,它就不再是"纯"的了。因此,这种技术满足了您的"非纯虚拟方法"需求,但它仍然是一种虚拟方法。

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

1
2
3
4
5
6
7
8
9
class BaseObject {
    //...
};

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

所以您可以实例化一个BaseObject,而不是BaseClass