【发布时间】:2018-02-09 18:02:58
【问题描述】:
我目前正在使用 C++ 开发一个小型私人项目,我想出了以下结构:
#include <iostream>
class A
{
std::vector<int> vec;
protected:
virtual bool onAdd(int toAdd) {
// should the 'adding' be suppressed?
// do some A specific checks
std::cout << "A::onAdd()" << std::endl;
return false;
}
public:
void add(int i) {
if(!onAdd(i)) {
// actual logic
vec.push_back(i);
}
}
};
class B : public A
{
protected:
bool onAdd(int toAdd) override {
// do some B specific checks
std::cout << "B::onAdd()" << std::endl;
return false;
}
};
在此示例中,onAdd 基本上是add 的回调,但以更加多态的方式。
当一个类C 继承自B 并且想要覆盖onAdd 时,就会出现实际问题。在这种情况下,调用C::add 时,B 中的实现将被丢弃(即不调用)。所以基本上我想要实现的是一个类似构造函数的行为,我能够在类层次结构的不同位置覆盖相同的方法,并且所有这些都被调用。
我现在的问题是:是否有可能/设计来实现这一目标?不过,我确信它不会像级联构造函数那样简单。
注意:不要过分关注add 示例。问题是关于类似回调的结构,而不是 add 是否有意义。
【问题讨论】:
-
C 可以直接调用
B::onAdd -
是的,但我想尽可能避免这种情况。
-
我想负责从
C调用B::onAdd,因为当add被调用时,这将是错误的行为。也许我需要补充一点,B是一种框架边界。 -
@SebastianKaupper 好吧,没有办法避免这种情况。您必须知道在覆盖时应该做什么。没有像构造函数那样的自动化。最后看看 Function Template Pattern 是否有助于解决这个问题。
-
“类构造函数”是什么意思?使用
int的构造函数不会自动调用使用int的父构造函数。
标签: c++ c++11 constructor c++14 virtual