是否有人知道C++中的语言特性或技术,以防止子类过度使用父类中的特定方法?
class Base { public: bool someGuaranteedResult() { return true; } }; class Child : public Base { public: bool someGuaranteedResult() { return false; /* Haha I broke things! */ } };
尽管它不是虚拟的,但仍然允许这样做(至少在我正在使用的Metrowerks编译器中),所有你得到的是关于隐藏非虚拟继承函数X的编译时警告.
当您可以使用final
虚拟方法的说明符(C++ 11引入)时,您可以这样做.让我引用我最喜欢的doc网站:
当在虚函数声明中使用时,final指定该函数不能被派生类覆盖.
适应你的例子:
class Base { public: virtual bool someGuaranteedResult() final { return true; } }; class Child : public Base { public: bool someGuaranteedResult() { return false; /* Haha I broke things! */ } };
编译时:
$ g++ test.cc -std=c++11 test.cc:8:10: error: virtual function ‘virtual bool Child::someGuaranteedResult()’ test.cc:3:18: error: overriding final function ‘virtual bool Base::someGuaranteedResult()’
当您使用Microsoft编译器时,还要查看sealed
关键字.
一些想法:
让你的功能私密.
不要让你的功能虚拟化.这实际上并没有阻止该函数被另一个定义遮蔽.
除此之外,我不知道一种语言功能会以某种方式锁定你的功能,这种方式可以防止它被重载,并且仍然可以通过指向子类的指针/引用来调用它.
祝好运!
听起来像你正在寻找的是相当于Java语言final关键字,它阻止一个方法被子类覆盖.
正如其他人在这里已经暗示,你真的不能避免这种情况.此外,这似乎是一个经常被问到的问题.