変更している既存のコードの非表示の仮想メソッドについて、Sun C++5.10コンパイラからコンパイル警告が表示されます。何らかの理由で、作成者は特定のデータ型に対して関数のオーバーライドを実装していません。私はここで状況を再現しました:
// First the data types
struct Shape {};
struct Square : public Shape {};
struct Circle : public Shape {};
struct Triangle : public Shape {};
// Now the visitor classes
struct Virtual
{
virtual ~Virtual() {}
virtual void visit( Square& obj ) {}
virtual void visit( Circle& obj ) {}
virtual void visit( Triangle& obj ) {}
};
struct Concrete : public Virtual
{
void visit( Square& obj ) {}
void visit( Circle& obj ) {}
};
int main()
{
Concrete myConcrete;
return 0;
}
Concrete
クラスは実装されておらず、void visit( Triangle& obj ) {}
これにより次のエラーメッセージが表示されます。
"pv_block.cpp", line 20: Warning: Concrete::visit hides the virtual function
Virtual::visit(Triangle&).
コードは正常に機能しますが、この警告メッセージを削除すると便利です。したがって、コンパイラが満足するように関数を実装したいのですが、現時点では明らかに必要ないため、使用できないように(できればコンパイル時に検出されるように)。
コンパイルを許可するが使用を防ぐためにコンパイルアサーションを実装する方法はありますか?BoostまたはC++11にアクセスできません。