2

クラスを保護されたベースにキャストする必要があります。

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());
}

に を追加する必要がありLineますArrayが、Objectベースが表示されません。そのメソッドを公に再実装する必要がありますか、それともオーバーライドできる暗黙のキャスト演算子がありますか?

4

2 に答える 2

3

Lineこれにより、 aを に暗黙的に変換できないことをコンパイラに伝えますObject

class Line : protected Object {
};

しかし、あなたはこれをやりたいと思っているし、これをしなければならないようにも思えます。したがって、継承を公開します。これは設計上の問題です。

protected基本クラスにメソッドを保持するためだけに継承を行わないでくださいprotected

もう 1 つのオプションは、キャスト演算子を Line に実装することです。

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

次のように関数を呼び出します。

a.Add(Line());

それ以外の

a.Add(new Line());

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

于 2011-12-19T09:05:13.680 に答える
2

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、この方法で派生するクラスが他にもあると想定したため、そこでテンプレートが役立ちます。

于 2011-12-19T09:05:29.620 に答える