所以我长期使用C和Java,但我并不熟悉C ++。情况是我们有:
base class template 1 -> base class template 2 -> several relevant subclasses
目前所有最终的子类都继承了类1中的成员函数,但我们只需要在其中一个子类中更改此函数的行为,并且只有在设置了代码中的其他位置的变量时才能更改,否则运行函数如类1中所定义。有没有办法在if-else
的另一端没有插入整个函数定义的情况下执行此操作?我已经查看了SFINAE / enable-if,但这些用于基于类型的决策,而不是像这样的简单条件。
如果我遗漏任何容易或愚蠢的事,请告诉我。
某些伪代码可能有所帮助:
template <class Face> class Publisher {
virtual void publish(...) {
// do stuff
}
}
template <class NewsType> class NewsPublisher : public Publisher<OnlineFace> {
// constructors, destructors...
}
class MagazinePublisher : public NewsPublisher<Sports> {
void publish(...) {
if(that.theOther() == value) {
// do different stuff
} else {
// do whatever would have been done without this override here
}
}
}
答案 0 :(得分:4)
根据您的示例,您只需显式调用基类实现:
class MagazinePublisher : public NewsPublisher<Sports> {
void publish(...) {
if(that.theOther() == value) {
// do different stuff
} else {
// call the base class implementation, as this function would not
// have been overridden:
NewsPublisher<Sports>::publish(...);
// ^^^^^^^^^^^^^^^^^^^^^^^
}
}
}
好吧,我想你的实际基类函数publish()
被声明为virtual
成员。
此外,由于您的示例只是伪代码而我无法对其进行测试,因此您可能需要添加publish()
类中应使用的NewsPublisher<T>
实现:
template <class NewsType> class NewsPublisher : public Publisher<OnlineFace> {
public:
// constructors, destructors...
using Publisher<OnlineFace>::publish(); // <<<<<<<<<<<<<
}