要求基类中的方法被其所有子类覆盖

时间:2012-06-16 19:37:07

标签: c++ inheritance

在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;
}

2 个答案:

答案 0 :(得分:4)

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

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 :(得分:0)

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

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