2017-09-19 4 views
1

C++でリファレンスキャストをオーバーロードすることは可能ですか?C++リファレンスキャストのオーバーロード(ダウンキャスト継承)

私は形式に触れることができないコード持って

:私は動作を調整したい

void someMethod(Parent& parentReference, ...){ 
    ... 
    Child& child = static_cast<Child&>(parentReference); 

(クラスの子がクラスの親から直接、公表継承)

をこのキャストの - 私はクラスの子を変更することができます。
私はそうのようなキャスト演算子をオーバーロードしようとしました:

Parent::operator Child&(){ 
    ... 

しかし、このメソッドが呼び出されることは決してありません。

これが可能かどうか疑問に思い始めていますか?

EDIT
パーR Sahu、私はこのシナリオに近いです:代わりに、単にB &br = d;を割り当てることを除いて https://timsong-cpp.github.io/cppwp/n3337/expr.static.cast#2

struct B { }; 
struct D : public B { }; 
D d; 
B &br = d; 

static_cast<D&>(br);   // produces lvalue to the original d object 

brは、引数としてメソッドに入ってくる、と以前にありますネットワーク経由で(NMLとして)送信されます。

これはシナリオのようになります。

struct B { }; 
struct D : public B { 
    int a; 
    int b 
}; 

D d; 
d.a = x; 
d.b = y; 

server.send(d); 

... 

client.receive(msg); 

receive(B& msg){ 

    D& msgD = static_cast<D&>(msg); 

} 

msgD.xmsgD.yワイヤ上に来て、適切に再構築されています。しかし、receiveメソッドを変更することなく、再構築方法を変更したいと思います。これは可能ですか?

+1

'Parent'を変更できない場合、コンパイラは' Parent :: operator Child&() 'を定義させるべきではありません。 – Brian

+1

[\ static \ _cast \ *演算子をオーバーロードすることはできますか?](https://stackoverflow.com/questions/8432651/is-it-possible-to-overload-the-static-cast-オペレータ) –

+0

@Brain - それは間違いだった - それに応じて編集した。私は実際に親を変更することができます。 – fatman

答えて

0

考える授業

struct Parent 
{ 
}; 

struct Child : Parent 
{ 
}; 

static_cast<Child&>は、ユーザー定義の変換関数を使用することはありません。

5.2.9 Static cast/2

Bがクラスタイプであるタイプの左辺値「CV1のB」から、あれば、DはBから派生したクラスである「CV2のDへの参照を」型にキャストすることができますcv2はcv1と同じcv-qualification、またはcv1より大きいcv-qualificationであり、BはDの仮想基底クラスでも基本クラスでもない結果はタイプ "cv2 D"です。

には "otherwise"句がありますおよび5.2.9 Static cast/5

上記の解釈では、ChildはサブタイプParentであるため、上記の4と5は適用されません。

+0

それではどのように '子child3 = static_cast (親);' を呼び出す '親::演算子子&(){...' – fatman

+2

@fatman、私はちょっと答えを更新しました。 'static_cast 'は 'static_cast 'とは異なります。 –

+0

@R Sahu - 返事をいただきありがとうございます。それは私がやろうとしていることを正確に照らしてくれました。私は上記の私の質問に詳細を追加しました。 – fatman