2016-11-12 8 views
3
class LinkedList{ 
    public: 
    int data; 
    LinkedList *next; 
}; 

class NewLinkedList: public LinkedList{ 
    public: 
    int data2; 
}; 

私はNewLinkedListを使用する場合、私はキャストタイプなしnewlinkedlist.next->data2にアクセスできないように、そのnextは、まだLinkedList代わりのNewLinkedListへのポインタです。 (newlinkedlistNewLinkedListのオブジェクトです)C++の継承

この問題を回避するには、これらの2つのクラスをどのように設計できますか?

SELF_TYPE *next;のようなものがあり、それが継承されると自動的に派生クラスの型になりますか?

+0

仮想継承についてのご質問はありますか? – curiousguy

答えて

3

あなたは、テンプレートを使用することができます。

template <typename T> 
class LinkedList{ 
public: 
    int data; 
    T * next; 
}; 

class NewLinkedList: public LinkedList<NewLinkedList>{ 
public: 
    int data2; 
}; 

この技術は、設計を改善するには不思議なことに、定期的なテンプレートパターン(CRTP)

として知られている、あなたのLinkedListクラスは、他の任意のデータを含めるべきではありませんリンクされたリストメカニズムに必要なものよりも優先されます。基本クラスのみでなければなりません。次に、上記のように特殊クラスでサブクラス化します。

+0

それでは、 'LinkedList'ベースクラスをどのように使うことができますか? – zzh1996

+0

私は、LinkedListを直接使用する必要はなく、サブクラスを介してのみ、より良い設計になると思います。 LinkedListはデータを保存しません(データメンバーを削除します)、純粋なリンクリストテンプレートになります。 – galinette

0

私は、親クラスを抽象的にし、データメンバーを非公開にすることをお勧めします(そうしないと本当に良い理由がない限り、ほとんどの場合、そうする必要があります)。これらのメンバー。それは良いデザインになり、あなたの問題も解決します。

+0

派生クラスの抽象関数の実装で型キャストを使用する必要があります。例えば'return(派生*)Base :: get_next();' – zzh1996

-1

あなたが達成したいことが可能であるとしましょう。

は考えてみましょう:

class AveryNewLinkedList: public LinkedList{ 
    public: 
    int data2; 
}; 

nextタイプAveryNewLinkedListまたはNewLinkedListのでしょうか?

コンパイラはわかりません。

継承とは、あなたの両親から少しのビットを取得して追加することです。しかし、親はあなたから何も取得しません!