可能重复:
带有实现的纯虚函数
我有一个基类,它有一个名为time()
.
我的想法是拥有一个纯虚函数,从它继承的所有类都必须实现。
但是我也想添加默认行为;调用time()
函数的人需要打印“hello”。
那可能吗?
实现此类目标的最简单方法是使用以下内容:
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
)。
有人评论了override的使用,这是C++11的一个特性,如果你拥有它,从长远来看会省去很多头疼的问题:
http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final
而且,该_impl
功能应该是私有的,除非您希望用户绕过默认行为,但我认为在大多数用例中这是一个糟糕的设计。
您可以通过使virtual
函数 not来在基类中提供默认行为pure virtual
。但是,如果不对孩子的实现施加一些限制,就不能强制实现调用此默认行为(有关详细信息,请参阅@111111 答案)。您应该检查您的要求,看看这是否是一个可接受的解决方案。