まず、いくつかの簡単な問題を片付けましょう。Class Class1 { ... }
クラスを定義するために使用していますclass Class1 { ... };
。つまり、キーワードは is でclass
あり、セミコロンで定義を終了する必要があります。さらに、Class2
コンストラクターの最初のパラメーターは型Class1&
ですが、使用していません。Class1
ここに渡したものはすべて無駄になります。
あなたの例でvar
は、タイプClass1
であり、のメンバーですClass2
。これは、プライベート メンバーClass2
にアクセスできる特別な特権を与えるものではありません。Class1
彼らは完全にプライベートです。
あなたのタイトルでは、コンストラクターをオーバーライドしていると言っています。オーバーライドは、クラスの継承にのみ適用されます。別のクラスを継承するクラスは、そのメンバー関数をオーバーライドできます。Class1
したがって、現時点では、基本クラスまたは のメンバーになりたいかどうかは不明ですClass2
。
継承が必要な場合は、 の宣言をClass2
に変更する必要がありますclass Class2 : public Class1 { ... };
。これは からClass2
継承することを意味しClass1
ます。Class1
ただし、メンバーは非公開であるため、アクセスすることはできません。それらを派生クラスで使用できるようにするには、それらを作成するか、protected
またはpublic
前者を優先する必要があります。
class Class1 {
protected:
Class1(string name, string city) : name(name), city(city) { }
string name;
string city;
};
class Class2 : public Class1 {
private:
string id;
string age;
public:
Class2(string name1, string city1)
: Class1(name1, city1)
{ }
};
代わりに構成が必要な場合、つまりClass1
のメンバーである場合は、のメンバーを設定する何らかの方法をClass2
提供する必要があります。現時点では、そのメンバーはプライベートであるため、何もできません。それらを作成することもできますが、それは非常にお勧めできません。それを行うためのより良い方法の 1 つは、次のことができる publicと関数を提供することです。Class2
Class1
public
setName
setCity
Class1
Class2
var.setName(name1);
var.setCity(city1);
さらに良いことに、セッターを目的として作成するのはかなり悪い設計だと思う傾向があるためClass
、名前と都市を設定var
し、Class1
の初期化リストで初期化するコンストラクターを指定する必要があります。
class Class1 {
public:
Class1(const string& name, const string& city)
: name(name), city(city)
{ }
private:
string name;
string city;
};
class Class2 {
private:
string id;
string age;
Class1 var;
public:
Class2(string name1, string city1)
: var(name1, city1)
{ }
};