我有一个类层次结构,如:
class A {
list<A*> children;
public:
void update() {
do_something();
update_current();
for(auto child : children)
children->update();
}
protected:
virtual void update_current() {};
};
class B : public A {
protected:
void update_current() override {
do_something_important();
};
};
class C1 : public B {
protected:
void update_current() override {
B::update_current();
do_something_very_important();
};
};
class C2 : public B {
protected:
void update_current() override {
B::update_current();
do_something_very_important_2();
};
};
int main() {
A* a = new A();
//fill a's childred list somehow
while(come_condition) {
//some code
a.update();
//something else
}
return 0;
}
问题是:如何在不改变程序行为的情况下从派生类中删除重复的B::update_current();
调用?除了手动调用基类函数之外,它是否可能或没有解决方案?谢谢。
答案 0 :(得分:3)
你可以让B
的孩子覆盖不同的功能:
class B : public A {
protected:
void update_current() override final {
do_something_important();
do_something_important_later();
};
virtual void do_something_important_later() = 0;
};
使用:
class C2 : public B {
protected:
void do_something_important_later() override {
do_something_very_important_2();
};
};