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();