bases.h ….
#ifndef baseexample_h#define baseexample_h#include <iostream>class Base{ public: voID foo() { std::cout << "Base.foo()\n" << std::endl; }};class Derived: public Base{ public: voID foo(){ std::cout << "Derived.foo()\n" << std::endl; } };#endif
和main.cpp …
#include "bases.h"#include <iostream>int main(){ Base base; Derived derived; base.foo(); derived.foo(); std::cin.get(); return 0;};
当然是输出
Base.foo()Derived.foo()
因为派生的foo()函数隐藏了基本的foo函数.我想防止可能的隐藏,所以我的想法是将头文件基本定义更改为:
//.....class Base{ public: virtual voID foo() final { std::cout << "Base.foo()\n" << std::endl; }};class Derived: public Base{ public: voID foo(){ //compile error std::cout << "Derived.foo()\n" << std::endl; } };//......
这似乎强制执行我想要的编译器错误,防止覆盖和/或隐藏在c中,但我的问题是,这是一个很好的做法,因为foo()从来不是一个虚拟函数开始?这是否有不利因为我有点滥用虚拟关键字?谢谢.
解决方法 我会说,是的,这是不好的做法.当你不想要它时,你引入了多态性,只是为了防止名称隐藏.但名字藏匿有什么不好?显然,无论出于何种原因,Derived的设计都希望在其基类中隐藏函数foo;它就是它所做的 – 也许它自己调用Base :: foo然后执行Derived中所需的一些额外活动.
试图颠覆这一点已经够糟糕了;试图通过选择你不想要的语言功能来做到这一点甚至更糟.
如果你真的需要调用基函数,请使用derived.Base :: foo(),但要注意你实际上是在破坏Derived类的API,你应该使用它来记录.
总结以上是内存溢出为你收集整理的防止覆盖和/或隐藏基类功能(C 11)全部内容,希望文章能够帮你解决防止覆盖和/或隐藏基类功能(C 11)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)