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() は最初から仮想関数ではなかったので、これは良い習慣ですか? 私は仮想キーワードを悪用しているので、これにマイナス面はありますか? ありがとう。