gpt4 book ai didi

c++ - 有没有办法强制调用重写的方法?

转载 作者:太空狗 更新时间:2023-10-29 21:19:55 24 4
gpt4 key购买 nike

代码场景如下:

class ParentClass {
void foo();
virtual void doSomething() { foo(); }
};

class ChildClass : public ParentClass {
virtual void doSomething();
};

现在,有没有办法强制子类调用父类的doSomething()?让我们假设调用 foo() 是至关重要的,并且应该始终在调用 doSomething() 时调用。子类当然可以调用 ParentClass::doSomething(),但似乎有点“冒险”,因为它不是强制执行的。

我想出了一个“肮脏”的解决方案,它是这样的:

class ParentClass {
void foo();
void doSomething() final {foo(); doSomethingChild(); }
virtual void doSomethingChild() = 0;
};

class ChildClass : public ParentClass {
virtual void doSomethingChild();
};

这样,子类必须执行实现并且 foo() 总是被调用,但方法不再相同。有没有更优雅的解决方案?

最佳答案

这不是肮脏的解决方案,而是您自己发现的非虚拟接口(interface)惯用语(或模板方法模式)。

通过定义调用虚函数(除其他事项外)的非虚函数,您可以强制类的每个实现都实现非虚函数的行为。实现只能自由修改部分行为,即对虚函数的调用。

这通常是这样完成的:

class Base {
public:
void foo() {
//do stuff
fooImpl();
//do other stuff
}
private:
virtual void fooImpl(); //pure or not
};

class Derived : public Base {
private:
virtual void fooImpl(){
// Implement or change fooImpl behavior
}
};

使非虚拟公共(public)和虚拟私有(private)确保没有人可以在这些类上调用 fooImpl,这正是您想要的,因为您需要在之前和/或之后执行一些操作调用 fooImpl

关于c++ - 有没有办法强制调用重写的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25821773/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com