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; } }; |
当提供了一个虚拟方法的实现(也就是说,虚拟方法不是用
我假设您希望这样做,因为您认为您的代码的某些部分需要实例化一个普通的
1 2 3 4 5 6 7 8 9 | class BaseObject { //... }; class BaseClass { protected: BaseObject base; virtual int printStuff () = 0; }; |
所以您可以实例化一个