如何强制从重写方法调用重写的方法基方法?
How can one force an overriden methods base method to be called from the overriden method?
我有一个类:
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
可以是纯虚拟的,那么派生类就不能忘记提供实现。
相关文章:
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 方法重写线程C++中的概念
- 如何强制从重写方法调用重写的方法基方法?
- 如何重写全局方法名称以在调用原始方法之前将我的代码推到前面
- C++有没有办法强制重写一组方法,如果其中一个方法在子类中具有重写?
- 在 C++ 中使用模板方法重写类方法
- 检查子类是否执行了方法重写
- C++方法重写和重载(编译器级别)
- 用模板方法重写虚拟方法
- 方法重写(没有虚拟方法或指针)是否被认为是多态性的一部分
- C++ - 方法重写未按预期表示
- 使用两种方法重写<<运算符
- C++阻止方法重写
- C++方法重写
- c++在具体类中强制方法重写
- 方法重载和方法重写的性能问题
- C++中的方法重写是否总是在派生类的标头中完成?
- 是否有更好的方法重写此代码片段
- 为什么静态方法重写基类非静态方法
- 方法重写