【发布时间】:2012-11-13 03:44:57
【问题描述】:
我有一个基类,它有一个名为time() 的函数。
我的想法是拥有一个纯虚函数,从它继承的所有类都必须实现它。
不过我还想添加默认行为;调用time() 函数的人需要打印“hello”。
那可能吗?
【问题讨论】:
-
我不认为被标记为重复的 Q 回答了这个 Q。
标签: c++
我有一个基类,它有一个名为time() 的函数。
我的想法是拥有一个纯虚函数,从它继承的所有类都必须实现它。
不过我还想添加默认行为;调用time() 函数的人需要打印“hello”。
那可能吗?
【问题讨论】:
标签: c++
您可以通过使您的virtual 函数不是pure virtual 来在您的基类中提供默认行为。
但是,您不能强制实现调用此默认行为而不对孩子的实现施加一些限制(有关详细信息,请参阅@111111 答案)。您应该检查您的要求,看看这是否是一个可接受的解决方案。
【讨论】:
实现此类目标的最简单方法是使用以下内容:
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 函数时,它会调用基类 time 函数,该函数执行默认行为,然后对覆盖的行为进行 virtual 调用。
正如 Als 在 cmets 中所说,这称为模板方法模式,您可以在此处阅读:
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 函数应该是私有的,除非您希望用户绕过默认行为,但我认为在大多数用例中这是一个糟糕的设计。
【讨论】:
override 在那里。编辑:别管第二个问题,谢谢你让我学到了新东西!
time 和time_impl。