0

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

2 回答 2

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
    }
};
于 2012-06-16T19:39:18.590 回答
0

这取决于你的要求是什么意思。通常“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;
};

所以你会实例化 aBaseObject而不是 a BaseClass

于 2012-06-16T20:32:51.363 回答