首先,让我们解决一些简单的问题。你Class Class1 { ... }
用来定义一个类,当它应该是class Class1 { ... };
. 也就是说,关键字 isclass
并且您需要以分号结束定义。此外,您的Class2
构造函数的第一个参数是类型Class1&
,但您甚至没有使用它。Class1
您在这里传递的任何内容都将被浪费。
在您的示例中,是var
类型并且Class1
是. 这并没有赋予任何特殊的特权来访问s 私人成员。他们是完全私人的。Class2
Class2
Class1
在您的标题中,您说您正在覆盖构造函数。覆盖仅适用于类继承。从另一个类继承的类可能会覆盖其成员函数。所以现在,不清楚你是想Class1
成为基类还是Class2
.
如果继承是您正在寻找的,您应该更改您的声明Class2
to 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
- 那么您需要提供Class2
一些方法来设置Class1
. 目前,它的成员是私人的,所以你不能做任何事情。你可以制作它们public
,但那将是非常不鼓励的。一种更好的方法是提供允许这样做的公共setName
和setCity
功能:Class1
Class2
var.setName(name1);
var.setCity(city1);
更好的是,因为我倾向于认为为了它而制作 setter 是非常糟糕的设计,所以您应该提供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)
{ }
};