私はプログラムのクラスのリストを作成しています。ただし、基本クラスには複数の子があり、子の中には子もあります。継承クラスに対応するためにリストを変更する必要はありますか?助けてくれてありがとう!C++で継承されたクラスを持つリンクリスト?
よろしくお願いします。これは信じられないほど基本的な質問ですが、孫クラスを作成するときは、これは適切な書式設定ですか?
クラスC:パブリックB:パブリックA {
又は単に
クラスC:パブリックB {?
私はプログラムのクラスのリストを作成しています。ただし、基本クラスには複数の子があり、子の中には子もあります。継承クラスに対応するためにリストを変更する必要はありますか?助けてくれてありがとう!C++で継承されたクラスを持つリンクリスト?
よろしくお願いします。これは信じられないほど基本的な質問ですが、孫クラスを作成するときは、これは適切な書式設定ですか?
クラスC:パブリックB:パブリックA {
又は単に
クラスC:パブリックB {?
は、以下のプログラムを取る:
#include <iostream>
#include <list>
struct A
{
virtual void hello()
{ std::cout << "Hello from A\n"; }
};
struct B : public A
{
virtual void hello()
{ std::cout << "Hello from B\n"; }
};
int main()
{
std::list<A> l1;
std::list<A*> l2;
A a;
B b;
l1.push_back(a);
l1.push_back(b);
l2.push_back(&a);
l2.push_back(&b);
l1.front().hello();
l1.back().hello();
l2.front()->hello();
l2.back()->hello();
}
我々は二つのリスト、クラスA
のインスタンスを使用して1、およびA
への1つの使用してポインタを宣言します。 B
はA
(継承のため)であるため、B
のインスタンスを最初のリストに入れることができます。ただし、最初のリストの項目からデータとメソッドにアクセスしようとすると、B
のデータにアクセスすることはできません。項目には、A
のクラスではないと考えられます。
ポインタの使用とメソッドの仮想オーバーロードのために、2番目のリストでは動作します。
私はこれがあなたの質問に少し役立つことを願っています。
おそらく、クラスのリストではなく、クラスのインスタンスを作成している可能性があります。大きな違いがあります。 「クラス」はデータメンバーと関数の定義にすぎませんが、インスタンスは実際にはこの定義に人生を埋め込みます。
それ以外に、継承したクラスのインスタンスを、親クラスを記憶域タイプとして持つリストに入れることはできません。これは、リスト内のインスタンスへのポインタまたは参照を格納し、インスタンスを別の場所に割り当てる場合にのみ機能します。
おそらく、基本クラスに仮想デストラクタがあるかどうかを確認したい場合や、厄介なメモリリークが発生する可能性があります。 –
STLコンテナの問題とその継承では、STLコンテナにはオブジェクトのコピーが格納されるため、進行中に子クラスのすべての拡張プロパティが失われます。解決策は、オブジェクトを単独のままにして、オブジェクトをコピーしないことです。
STLコンテナでは、[スマート]ポインタを基本クラスに格納できるため、ポインタのみがコピーされます。
class C: public B {
そしてもちろん:
class B : public A {
CはのサブクラスであるBのサブクラスであるまたはあなたはそれが唯一であるBoost::Intrusiveまたはqueue.h
などの侵入リストで行くことができますA.
A、B、Cのインスタンスが混在するリストを希望する場合は、それを宣言する必要があります。
list<A*> myClassList;
注: 'B'のインスタンスを' std :: list 'にプッシュすると、*スライス*になります。 –
それが何であるか不思議な人には、http://stackoverflow.com/q/274626/440558を参照してください。 –