2011-12-19 22 views
1

私は、その保護されたベースにクラスをキャストする必要があります:C++、派生クラスを保護基底にキャストする方法?

class ComplicatedOne : public Object { 
    //Lots of funcs I don't want or need. 
}; 

class Line : protected ComplicatedOne { 
    //Some funcs of ComplicatedOne get re-implemented or called by alias here 
}; 

class Array { 
    void Add (Object &obj); 
}; 

main() { 
    Array a; 
    a.Add(new Line()); 
} 

私はArrayLineを追加する必要がありますが、Objectベースは表示されません。私はそのメソッドを公的に再実装すべきか、あるいはオーバーライドできる暗黙的なキャスト演算子があるのでしょうか?これにより

+0

実際のコードを投稿してください。 – curiousguy

答えて

2

、あなたが暗黙的にObjectLineを変換することはできませんコンパイラ言っている:

class Line : protected Object { 
}; 

をしかし、あなたがすべきことは、あなたがこれをやりたいように思われ、これを行う。だから、継承を公開してください。これは設計上の問題です。

protectedメソッドを基本クラスのままにしないでください。protectedそのような機能

class Line : protected Object 
{ 
public: 
    operator Object&(); 
}; 

およびコール:

もう一つの選択肢はラインでキャスト演算子を実装することである

a.Add(Line()); 

代わりの

a.Add(new Line()); 

それはできませんこの状況で暗黙的にポインタをキャストします。しかし、私は継承の型を変更することをお勧めします。

+0

さて、私は私の答えを編集しました。 –

1

Lineの友人とサブクラスのみがこのキャストを実行できます。あなたはそこに関数テンプレートを使用する必要はありません

class Line : protected Object { 
    friend class Array; 
}; 

class Array { 
public: 
    template<class T> 
    void Add (T &obj) { 
     add_impl(obj); // cast is accessible here, because Array is a friend 
         // of Line 
    } 

private: 
    void add_impl(Obj &obj); 
}; 

が、私はあなたがそうテンプレートが役立つだろう、このようにObjectから派生する複数のクラスを持っていると仮定:あなたはこれを行うことができます。

+0

アドバイスのように 'Array'を拡張することはできますが、提案されたものにもっと近似した解決策はありませんか?すなわち暗黙のキャスト演算子が完璧です。 – John

+0

継承を保護することによって、明示的に暗黙のキャストを禁止しています。これは矛盾している。 –

関連する問題