让我们说我们有以下层次结构:
class Abstract { public: virtual void foo() = 0; }; class Base : public Abstract { public: virtual void foo() override; //provides base implementation }; class Derived : public Base { public: virtual void foo() override; //provides derived implementation };
如果在Derived对象上调用了Base :: foo(),该对象将不会同步,并且其数据将被破坏.它继承了Base的数据结构及其操作,但需要执行其他操作,因此只调用Base :: foo()将省略这些额外的操作,从而导致Derived的状态将被破坏.
所以我想阻止直接调用Base的foo执行,所以这样:
Derived d; d.Base::foo();
理想情况下,应该给我一些编译时间的错误.或者什么也不做,否则被阻止.
但是可能是我违反了多态规则,应该使用组合,但这需要大量的额外的打字…
解决方法
template method pattern怎么样
class Abstract { public: void foo() { foo_impl(); } private: virtual void foo_impl() = 0; }; class Base : public Abstract { private: virtual void foo_impl() override; //provides base implementation }; class Derived : public Base { private: virtual void foo_impl() override; //provides derived implementation };
然后
void test(Abstract& obj) { obj.foo(); // the correct foo_impl() will be invoked } Derived d; test(d); // impossible to call the foo_impl() of Base