我发现了一种机制,至少我们被提示显式地宣布被覆盖的方法。虽然这不是完美的方式。
假设,我们virtual
在 base 中有几个纯方法class B
:
class B {
virtual void foo () = 0;
virtual void bar (int) = 0;
};
其中,假设我们只想foo()
被整个层次结构覆盖。为简单起见,我们必须有一个virtual
包含特定方法的基类。它有一个模板构造函数,它只接受与该方法相同的类型。
class Register_foo {
virtual void foo () = 0; // declare here
template<typename T> // this matches the signature of 'foo'
Register_foo (void (T::*)()) {}
};
class B : public virtual Register_foo { // <---- virtual inheritance
virtual void bar (int) = 0;
Base () : Register_foo(&Base::foo) {} // <--- explicitly pass the function name
};
层次结构中的每个后续子类都必须在其每个构造函数中显式注册a 。例如:foo
struct D : B {
D () : Register_foo(&D::foo) {}
virtual void foo () {};
};
这种注册机制与业务逻辑无关。虽然,孩子class
可以选择使用自己的foo
或父母的foo
甚至一些类似的语法方法进行注册,但至少这是明确宣布的。