この質問は、異なる戻り型を持つ派生クラスの仮想メソッドをオーバーライドすることに関するものです。次のコードの場合:
class father {
public:
virtual father* ref() { return this; }
};
class child : public father {
virtual child* ref() { return this; }
};
ポインタを直接取得しようとすると、g ++(F15、g ++ 4.5)は「父から子への無効な変換」を報告します
child m_child;
father* pf = &m_child;
child* pc = pf->ref();
子クラスのref()メソッドが使用されていることを理解しています。これは、おそらくコンパイル時の型の不一致にすぎません。
ただし、型キャストを明示的に使用せずにそれを行う方法はありますか?
追加の説明:コンパイラがこのエラーを報告する理由を理解しています。私が必要としているのは、ポインタを明示的に変換せずに派生オブジェクトのデータにアクセスできる、すぐに使えるものです。
父クラスは、さまざまな派生子オブジェクトをリストまたはベクトルに配置するために使用されるため、アイテムがリストまたはベクトルからフェッチされるときに、それがどの子クラスに属しているかを判断する方法はありません。
子クラスのタイプを記録して確認するための内部メソッドがあります。しかし、私はポインタを明示的に変換したくありません。
たとえば、私は次のようなことをしたいと思います。
// assuming pf is pointer pointed to an item fetch from a vector
switch(fp->get_type()) {
case child_type1: fp->ref()->list1.push(data); break;
case child_type2: fp->ref()->list2.push(data); break;
case child_type3: fp->ref()->list3.push(data); break;
}
今のところ、新しい変数を明示的に宣言するか、fpを適切な型に明示的に変換する必要があります。そのたびに、面倒で混乱を招く派生クラスのデータにアクセスする必要があります。
私が期待しているのは、いくつかのBoostライブラリが、私がまだ知らない別の方法で同様のことを実行できるのか、それともc ++ 11標準で許可されているのに、特別なコンパイルパラメータを設定する必要があるのかということです。