我想要防止甚至隐藏基类非虚函数一段时间以来我学习了C ++,而且我不确定这是否符合道德规范,但C ++ 11的功能给了我一个想法。假设我有以下内容:
... 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 ++中覆盖AND / OR隐藏,但我的问题是,这是一个好习惯因为foo()从来不是虚拟的功能开始?这有什么不利因为我有点滥用虚拟关键字吗?感谢。
答案 0 :(得分:4)
我说,是的,这是不好的做法。当你不想要它时,你引入了多态性,只是为了防止名称隐藏。
但名字隐藏真是太糟糕了?显然,无论出于何种原因,Derived
的设计都希望在其基类中隐藏函数foo
;这就是它的作用 - 或许它自己调用Base::foo
然后执行Derived
中所需的一些额外活动。
试图颠覆这种情况已经够糟糕了;尝试通过选择您不想要的语言功能来实现这一目标更糟糕。
如果您确实需要来调用基本函数,请使用derived.Base::foo()
,但请注意,您实际上正在破坏类Derived
的API,您应该使用它按照记录使用。