1、包含类对象成员
//.h
#include <string>
#include <valarray>
Class Student {
std::string name; // 包含类对象成员方式
std::valarray<double> scores[10];
}
通过成员变量直接访问成员方法。
2、私有继承
基类的公有成员和保护成员都将称为派生类的私有成员(包括变量与方法),这意味着,派生类只继承了基类的实现,但没有继承接口。只能通过派生类成员方法访问基类成员。
//.h
#include <string>
#include <valarray>
Class Student : private std::string,
private std::valarray<double>{
//不需要成员变量
}
私有继承不能也不需要在派生类中定义基类成员变量。
a、访问基类成员变量:强制类型转换
std::cout<<"name: " <<(const string & )student<<std::endl;
类方法内通过对*this进行强转进行访问
//string类中保存类名字变量,通过强转将类对象student变为string变量
b、访问基类方法:
i、作用域解析运算符与类名
只能派生类公有方法中使用,因为是私有继承。
由于私有继承,基类所有成员变量、方法在派生类中均为私有,只能在派生类的公有方法中调用。
double Studnet::sum() const {
return std::valarray<double>::sum();
}
ii、使用using重新定义访问权限 推荐使用
//.h
Class Student: private std::string,
private std::valarray<double>{
public:
using std::valarray<double>::min;
//using 声明只使用成员名,不需要圆括号(),特征标、返回类型
}
//.cpp
std::cout<<student.min(); //此时基类成员函数可直接调用,即使是私有继承
3、扩展:保护继承
4、如何确定使用私有继承还是包含成员
总结
1、通常使用包含类对象成员来建立has-a关系,在新类中需要访问原有类的保护成员或需重定义虚函数则使用私有继承。
2、私有继承不能也不需要在派生类中定义基类成员变量。
3、私有继承通过类声明中使用using重新定义访问权限,来调用基类成员方法。
4、私有继承通过类型强制转换访问基类成员变量。