在C++中为什么pure virtual
方法强制其强制覆盖only到它的直接子级(用于对象创建),但不到孙子级等等?
struct B {
virtual void foo () = 0;
};
struct D : B {
virtual void foo () { ... };
};
struct DD : D {
// ok! ... if 'B::foo' is not overridden; it will use 'D::foo' implicitly
};
我认为忽略此功能没有什么大不了的。
例如,从语言设计的角度来看,有可能:struct DD
被允许使用D::foo
仅当它有一些明确的声明时,例如using D::foo;
。否则它必须覆盖foo
强制性的。
在 C++ 中是否有任何实用的方法可以达到这种效果?
我发现了一种机制,至少会提示我们宣布重写的方法明确地。但这不是完美的方式。
假设,我们有几个纯粹的virtual
基础中的方法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
};
层次结构中的每个后续子类都必须register a foo
在其内部每个构造函数 明确地. e.g.:
struct D : B {
D () : Register_foo(&D::foo) {}
virtual void foo () {};
};
这种注册机制与业务逻辑无关。虽然,孩子class
可以选择使用自己的注册foo
或其父母的foo
甚至一些类似的语法方法,但至少是这样宣布明确地。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)