如何强制从重写方法调用重写的方法基方法?

How can one force an overriden methods base method to be called from the overriden method?

本文关键字:方法 重写 何强制 调用      更新时间:2023-10-16

我有一个类:

class MyCoolBean {
public:
virtual void toot(){
log("ooh la la");
}
}

还有我的派生类:

class MyCoolBeansBoy : public MyCoolBean{
public:
void toot()override{
log("oh yeah");
}
}

如果我这样做:

我的酷豆男孩博伊; boi.toot((;

输出为:

oh yeah

但我希望输出是:

ooh la la
oh yeah

现在我知道我可以将派生函数修改为:

void toot()override{
MyCoolBean::toot();
log("oh yeah");
}

但是如果我这样做,那么任何实现派生类的人都可以忘记。有没有强迫MyCoolBean::toot()被召唤?

编辑:我知道这在技术上是可能的,因为这个问题回答:

如何确保类的每个方法都首先调用其他方法?

上面链接中的解决方案可用于强制调用所有函数的成员函数!我的问题是如何仅对覆盖方法执行此操作,并专门调用基本方法!:)

你没有。

(因为不可能可靠地做到这一点,所以您链接中的答案很好,但它仅适用于指针,这是一个很大的限制(

要么您希望派生方法与基中的方法相同,然后不要将其声明为虚拟方法,要么......

如果希望派生类扩展基类方法功能,则可以使用所谓的模板方法模式:

class MyCoolBean {    
public:   
void toot() {             // <- not virtual !
log("ooh la la");
do_toot();
}
protected:                
virtual void do_toot() {}        // <- customization point
};

派生类:

class MyCoolBeansBoy : public MyCoolBean{
private:
void do_toot() override {
log("oh yeah");
}
};

现在

MyCoolBeansBoy x;
x.toot();

将记录两条消息。

这实现了您想要的,但具有某种颠倒的逻辑:当调用基类的方法时,基类"强制"每个派生类调用派生类的方法。do_toot可以是纯虚拟的,那么派生类就不能忘记提供实现。