私はクラスA、Bを持っています。 BはAから保護されているので、BからAへの暗黙のキャストを可能にするためにキャスト演算子を追加しましたが、暗黙的に使用するとエラーになります。
このコードを動作させるにはどうすればいいですか?
class A
{
public:
int a;
};
class B : protected A {
public:
int b;
operator const A&()const { return *this; }
};
B b;
const A& a = b; // ERROR: error C2243: "type cast" : conversion from "const b *" to "const A &" exists, but is inaccessible
どのように陰影をキャスティングするのですか?
回答:
回答№1は2提供したコンバージョン演算子は既に 暗黙。あなたが直面する問題は、コンパイラが2つの異なる変換シーケンスを B
に const A&
、導出された参照とユーザー提供された変換。コンバージョンには順序があり、派生からベースへのコンバージョンはユーザーが提供するコンバージョンよりも優れていると考えられます operator const A&() const
選択されません。
ただ継承を公開する。あなたは何の利益ももたらさない複雑なデザインを構築しようとしています。相続をすることによって得たいものは何ですか 保護された?アップキャストを避けますか?とにかく同じ変換を提供しようとしているのはなぜですか?あなたはインターフェイスの半分だけを許可するつもりですか? const
部)?あなたの派生したオブジェクトはベースとして使用できないので、あなたはLSPに従っていません...
回答№2の場合は0
明らかに、型変換演算子はBで定義されているので、タイプAのオブジェクトでは使用できません。C ++ではできません。これは、 "this"ポインタが定数ポインタであるためです。 したがって、A本体の中に次のコードを書くと、うまくいきません:
A(B* b)
{
this = b;//error, "this" pointer is a constant pointer.
}
言い換えると、A型の参照をB型オブジェクトを参照して暗黙的に参照することはできません。せいぜい、再解釈キャストを試して、それが機能するかどうかを確認することができます。
回答№3の場合は0
OK - 私は別のデザインを選択しました - 継承の代わりに合成を使用するこのようにして、保護されているインスタンスAを定義することができます
class B {
protected:
A a;
public
operator const A&()const { return a; }
};
B b;
const A& a = b;