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

C++ 如何强制从被重写的方法调用被重写的方法基方法?,c++,c++11,C++,C++11,我有一门课: class MyCoolBean { public: virtual void toot(){ log("ooh la la"); } } 以及我的派生类: class MyCoolBeansBoy : public MyCoolBean{ public: void toot()override{ log("oh yeah"); } } class MyCoolBeans

我有一门课:

class MyCoolBean {

public:

    virtual void toot(){
        log("ooh la la");
    }
}
以及我的派生类:

class MyCoolBeansBoy : public MyCoolBean{
public:
    void toot()override{
        log("oh yeah");
    }
}
class MyCoolBeansBoy : public MyCoolBean{
private:
    void do_toot() override {
        log("oh yeah");
    }
};
如果我这样做:

米考尔比恩斯博伊; boo.toot()

输出为:

oh yeah
但我希望输出是:

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

    void toot()override{
        MyCoolBean::toot();
        log("oh yeah");
    }
但是如果我这样做了,那么任何实现派生类的人都会忘记。有没有强制调用
mycolbean::toot()

编辑:我知道这在技术上是可行的,因为问题答案如下:

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

你没有

(因为不可能可靠地完成,所以链接中的答案很好,但它只适用于指针,这是一个相当大的限制)

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

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

现在

将记录这两条消息

这实现了您想要的功能,但使用了某种相反的逻辑:当调用来自基类的方法时,基类“强制”每个派生类调用派生类的方法
do_toot
可以是纯虚拟的,那么派生类就不能忘记提供一个实现。

您没有

(因为不可能可靠地完成,所以链接中的答案很好,但它只适用于指针,这是一个相当大的限制)

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

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

现在

将记录这两条消息


这实现了您想要的功能,但使用了某种相反的逻辑:当调用来自基类的方法时,基类“强制”每个派生类调用派生类的方法
do_toot
可以是纯虚拟的,那么派生类就不能忘记提供一个实现。

你不能这样做,并且链接问题的公认答案不能确保调用
log
log。人们仍然可以编写
loggingfoof;f、 a()
将直接调用
a
,而不执行
log
。您不能这样做,并且链接问题的已接受答案不会确保调用
log
log。人们仍然可以编写
loggingfoof;f、 a()
直接调用
a
,而不执行
log
class MyCoolBeansBoy : public MyCoolBean{
private:
    void do_toot() override {
        log("oh yeah");
    }
};
MyCoolBeansBoy x;
x.toot();