首先,让我们看看一些简单的问题。你使用Class Class1 { ... }
来定义一个类,它应该是class Class1 { ... };
。也就是说,关键字是class
,您需要用分号结束定义。另外,你的Class2
构造函数的第一个参数的类型是Class1&
,但你甚至没有使用它。你在这里通过的任何Class1
只会被浪费。
在您的例子,var
是Class1
类型的,并且是一个构件的Class2
。这不会给Class2
任何特殊privilages访问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
成员 - 那么你需要给Class2
一些方法来设置Class1
成员。目前,它的成员是私人的,所以你什么都做不了。你可能使他们public
,但这将是高度不鼓励。一个更好的办法来做到这一点是提供公共setName
和setCity
功能Class1
允许Class2
做:
var.setName(name1);
var.setCity(city1);
更妙的是,因为我倾向于认为做setter方法的缘故吧是很糟糕的设计,你应该给Class
一个构造函数,设置名称和城市,并在Class1
的初始化列表初始化var
:
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)
{ }
};
是的,'Class2'没有权力混淆'Class1'的私有成员。事实上,所讨论的Class1恰好是“Class2”的成员,这一点无关紧要。 (顺便提一下,很棒的类名。) – Beta
不仅是Class Class1不是C++,但即使它是一个可怕的命名方案。任何人都可以看到这一点,并在一次会议中理解发生了什么?尝试选择简单,简短,*可区分*名称。 –