要求基类中的方法被其所有子类重写
Require a method in a base class to be overridden by all of its subclasses
在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
。
相关文章:
- C++有没有办法强制重写一组方法,如果其中一个方法在子类中具有重写?
- 如何在子类中重写时调用私有虚拟基类实现
- 重写子类构造函数中的父类变量
- 检查子类是否执行了方法重写
- C++ - 如何使用基指针重写子类方法
- 如何在模板子类中重写转换运算符C++
- C++子类中的重写函数成员
- 如何重写模板化子类中的非模板化方法
- 要求基类中的方法被其所有子类重写
- 关于在强制转换为子类的超类时调用其重写方法
- c++ 调用子类而不是父类的重写函数
- 我可以重写并使用中模板类型的子类作为超级类吗
- Qt/C++重写函数而不进行子类化
- 重写QIODevice子类中的readData会返回错误的结果
- 重写子类中的返回类型
- 从模板子类调用模板基类的重写模板成员函数
- 为什么子类的非重写实例方法中的"this"类型是父类型?
- 由子类创建的对象的c++重写函数
- 一系列子类的重写方法
- 重写子类中的数组大小