自从我学习了 C++ 以来,我一直想阻止隐藏基类非虚拟函数,但我不确定这是否合乎道德,但 C++ 11 的特性给了我一个想法。假设我有以下内容:
基地.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() 从来都不是一个虚函数?由于我有点滥用virtual 关键字,这有什么缺点吗?谢谢。