我有一个基类,它有一个名为time()
的函数
我的想法是拥有一个纯虚函数,所有继承自它的类都必须实现。
但是我也想添加默认行为;调用time()
函数的人需要打印“你好”。
那可能吗?
答案 0 :(得分:3)
实现此类目标的最简单方法是使用以下内容:
class base {
virtual void time_impl()=0;
public:
void time() {
//Default behaviour
std::cout << "Hello\n";
//Call overridden behaviour
time_impl();
}
};
class child : public base {
void time_impl() override {
//Functionality
}
};
这样,当调用任何子节点的time
函数时,它会调用基类时间函数,该函数执行默认行为,然后对被覆盖的行为进行virtual
调用。
正如Als在评论中所说,这被称为模板方法模式,您可以在这里阅读:
http://en.wikipedia.org/wiki/Template_method_pattern
虽然C ++是一个相当混乱的名称(因为模板是其他东西,而“方法”在C ++中并不意味着什么(而是member function
)。
有人评论了使用覆盖,这是一个C ++ 11的功能,如果你有它使用它,从长远来看它会省去很多麻烦:
http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final
此外,_impl
函数应该是私有的,除非您希望用户绕过默认行为,但我认为在大多数用例中这是一个糟糕的设计。
答案 1 :(得分:0)
您可以通过virtual
函数pure virtual
来提供基类中的默认行为。
但是,您不能强制实现调用此默认行为,而不会对子实现实施某些限制(有关详细信息,请参阅@ 111111答案)。您应该检查您的要求,看看这是否是可接受的解决方案。