まず、いくつかの簡単な問題を片付けましょう。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と関数を提供することです。Class2Class1publicsetNamesetCityClass1Class2
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)
{ }
};