一,包含
类的数据成员是另一个类对象,下面定义一个Student类包含string类型的数据成员:
class Student{
private:
string name;
public:
Student():name("default"){}
Student(const string &name):name(name){}
};
二,使用包含的特点
1,包含实现的是has-a关系。
2,Student类的成员函数可以使用string类的公有接口来访问与修改name对象,但是在类的外面不能使用string类的接口。对于这种情况,通常描述为Student类获得了其成员对象的实现,但没有继承接口。
3,使用公有继承时,类可以继承接口,可能还有实现(基类的纯虚函数提供接口,但不提供实现)。获得接口是is-a关系的组成部分。而使用组合类可以获得实现,但是不能获得接口。不继承接口是has-a关系的组成部分。
三,私有继承
C++还有另外一种实现has-a关系的途径--私有继承。使用私有继承,基类的公有成员函数与保护成员函数都将成为派生类的私有成员函数。这意味着基类方法将不会成为派生类对象公有接口的一部分,但可以在派生类的成员函数中使用它们。总之,私有继承中派生类不继承基类的接口。
四,在私有继承中访问基类对象
class Person{
private:
string name;
public:
Person():name(""){}
Person(string name):name(name){}
void show(){
cout<<"Person"<<endl;
}
};
class Student : private Person{
private:
string number;
public:
Student():number(""){}
Student(string &name, string &number):Person(name), number(number){}
void show(){
cout<<"Student"<<endl;
}
Person &man(){
return (Person &)*this;
}
};
注意:
引用Student不会自动转换为Person引用。根本原因在于,在私有继承中,未进行显示类型转换的派生类引用或指针,无法赋给基类的引用或指针。