基本クラスの仮想関数を介してオブジェクトの派生型を取得しようとしています。私はこれを書きましたが、コンパイルされません:
struct base {
virtual base& get_this() {
return *this;
}
};
struct derived : base {
virtual derived& get_this() override {
return *this;
}
void fn();
};
int main () {
base* pd = new derived();
derived& x = pd->get_this(); /*ERROR*/
x.fn();
return 0;
}
derived&
... というエラーが表示されます: aから a を初期化できませんbase
。は仮想なのでget_this
、なぜaではなくa をpd->get_this()
返すのですか? 前もって感謝します!base&
derived&
編集:
有益な回答をくださった皆様に感謝し、返信が遅れたことをお詫びします。上記がコンパイルされない理由を理解するだけでなく、問題の解決策にも興味があることを元の投稿で指定する必要がありました。私の主な問題はfn
、クラスに固有でありderived
、基本クラスを介して呼び出すことができないことです。キャストを使用すると問題は確実に解決しますが、適切な型を取得するためだけに if else 構造を使用してコードを書くのは嫌いです (また、Scott Meyers はキャストに対してアドバイスしています :)) 。答えは、キャストが進むべき道であることを示しているようです。これは、私の問題に対するより「エレガントな」解決策を無視していないことを少なくとも安心させます。再度、感謝します!