类的实用技术
重载<<运算符
转换函数
构造函数使用new的类
类的继承
类有三种权限分别为public,private,protect,因此就对应三种继承方式,公有继承,保护继承,私有继承。但是对于派生类来说有些东西是相同的,对于继承方式来说并没有区别。
1.构造派生类对象之前,先调用基类构造函数,然后初始化基类数据,以及派生类数据。
2.派生类可以使用基类的方法,前提条件是方法不是私有的
公有继承:建立一种is-a关系,派生类对象也是一种基类对象,可以对基类采取的行为同样适用于派生类。
多态公有继承:原理是同一方法在基类和派生类中实现不一样,派生类中重新定义基类方法;使用虚函数
静态联编与动态联编
向上强制转换:派生类向基类转换,可以隐式转换
向下强制转换:基类向派生类转换,只能显式转换
编译器对非虚方法采用静态联编,对虚方法采用动态联编。
虚函数工作原理
编译器处理虚函数的方法:给每个对象添加一个隐藏成员。隐藏成员中保存了一个指向函数地址数组的指针。这种数组称为虚函数表。虚函数表中存储了为类对象进行声明的虚函数的地址。
访问控制:protected
protected和privated相似,在类外部,只能访问共有成员,而不能访问私有成员和保护成员。但是对于派生类来说,派生类成员可以访问基类的共有成员和保护成员,但是不能访问基类的私有成员。
抽象类
至少含有一个纯虚函数的类叫抽象类,而且抽象类不能创建对象,只能被继承。
virtual int show()=0;//纯虚函数
复制构造函数调用场景
1.将新对象初始化为一个同类对象
2.按值将对象传递给函数
3.函数按值返回对象
4.编译器生成临时对象
构造函数不被继承的原因
它创造一个对象,而其他方法只是被现有的对象调用而已,继承意味着派生类对象可以使用基类的方法。而构造函数在完成工作之前,并没有对象。
析构函数
基类的析构函数必须是虚函数
析构函数,构造函数,赋值运算符不能被构造
小结
派生类的赋值运算符/赋值构造函数也必须处理它的基类成员的赋值
derived& derived::operator=(const derived& rhs)
{
if (this == &rhs) return *this;
base::operator=(rhs); // 调用this->base::operator=
y = rhs.y;
return *this;
}