目录
1 类的继承
一个新的类拥有(共享)其它一个或多个已经存在的类的属性和方法,称为“类的继承”,例如:父亲和母亲是儿子的父类
新的类,称为“子类”或“派生类”
一个或多个已经存在的类,称为“父类”或“基类”
如果是拥有一个类的属性和方法,称为“单继承”
如果拥有多个类的属性和方法,称为“多继承”
1.1 单继承
格式:
class 新的类(子类或派生类) : 继承权限 已经存在的类(父类或基类)
{
};
例如:
class Son : public Father //Son类继承自Father类,Son就拥有Father的属性和方法
{
//拥有自己特有的属性和方法
};
1.2 多继承
格式:
class 新的类(子类或派生类) :继承权限1 已经存在的类1(父类1或基类1),继承权限2 已经存在的类2(父类2或基类2),.........
{
};
例如:
class Son : public Father1,protected Father2
{
}
注意:
多继承(菱形继承)会出现二义性问题?解决:虚继承
2 继承权限
C++提供了三种继承权限,分别是:public(共有)、protected(受保护)、private(私有)三种
(1)public继承
1)父类的public下的成员是被继承到子类的public修饰符下
2)父类的protected下的成员是被继承到子类的protected修饰符下
3)父类的private下的成员是没有被继承到子类中
(2)protected继承
1)父类的public下的成员是被继承到子类的protected修饰符下
2)父类的protected下的成员是被继承到子类的protected修饰符下
3)父类的private下的成员是没有被继承到子类中
(3)private继承
1)父类的public下的成员是被继承到子类的private修饰符下
2)父类的protected下的成员是被继承到子类的private修饰符下
3)父类的private下的成员是没有被继承到子类中
问题:
1)子类与父类有相同的属性或方法,那么继承之后?
如果子类与父类有相同的属性和方法,继承之后,子类会自动屏蔽父类与子类相同的属性和方法
2)父类的构造函数和析构函数有没有被继承到子类中?
父类的构造函数和析构函数是没有被继承到子类中
3)父类的构造函数和析构函数与子类的构造函数和析构函数的调用时机?
单继承:
先调用父类的构造,再调用子类的构造;先调用子类的析构,再调用父类的析构;
多继承:
先调用先继承的父类的构造,后调用后继承的父类的构造,再调用子类的构造;先调用子类的析构,再调用后继成的父类的析构,再调用先继承的父类的析构
4)子类中有其他类的对象,现在的类的的调用时机?
先调用父类的构造,再调用的其它类的构造,最后调用子类的构造;先调用子类的析构,再调用其他类的析构,最后调用父类的析构;
5)如果父类构造函数携带参数,子类如何实例化对象?
子类采用构造函数初始化列表的形式解决
3 虚继承
使用vritual关键字结合继承权限去继承父类,称之为“虚继承”
格式:
class 子类 : virtual 继承权限 父类 //虚继承
{
}
或
class 子类 : 继承权限 virtual 父类 //虚继承
{
}
4 抽象类
现实世界中有些事物是不能被实例化具体的对象,就可以用抽象类来描述
抽象类只是描述具备哪些方法,具体实现要在子类中
虚函数:
成员函数返回值前用关键字virtual来进行声明,表示该函数是一个虚函数
例如:
vritual void function() //虚函数
{
}
纯虚函数:
令虚函数等于0,就表示该函数是纯虚函数
格式:
virtual 函数返回值 函数名(参数列表)=0;//纯虚函数
例如:
virtual void function()=0; //表示function函数是纯虚函数
抽象类定义:
继承关系的类中,如果父类中如果含有纯虚函数,表示该类是一个抽象类,抽象类只是用于描述该类具备哪些行为,但是不具体实现这些行为
例如:
动物类------人、狗、蛇等等
(抽象类)
动物类:
跑---行为
子类-人:
跑---两只脚跑
子类-狗:
跑---四只脚跑
子类-蛇:
跑---蠕动跑
......
例如:
class Animal
{
public:
virtual void run() = 0;
};
class People :public Animal
{
public:
virtual void run()
{
cout << "用两只脚跑" << endl;
}
};
class Dog :public Animal
{
public:
virtual void run()
{
cout << "用四只脚跑" << endl;
}
};
5 多态
多种形态或多种实现方法,C++中的多态是指一种接口(指的是父类接口),多种实现方法(指的是每个子类所实现的方法),即通过父类接口实现调用子类的多种方法
构成多态性的条件:
1)具有继承关系的两个类
2)父类指针或引用指向子类
3)多种实现方法需要声明为虚函数
虚函数:
成员函数返回值前用关键字virtual来进行声明,表示该函数是一个虚函数
例如:
vritual void function() //虚函数
{
}
虚函数表(虚表):
用于存放类中的虚函数,每一个类都有自己独立的虚表(前提是有虚函数),并且每一个类的对象对于该类的虚表都是共享的
有虚表指针指向虚表:vptr
虚函数表是在编译时就建立
(1)静态绑定(静态联编)
是指函数或表达式的地址,在编译时就已经确定
根据对象的类型确定成员的调用地址
例子:
函数重载
模板
(2)动态绑定(动态联编)
是指函数或表达式的地址,在运行时才确定
例子:
多态
根据指向的地址的对象的类型来确定成员的调用地址
7 虚析构函数
为什么要提出虚析构函数?解决资源(子类)得不到释放的问题
面试题:
如果父类的析构函数不是虚函数,会带来(引起)什么问题?
带来的问题:资源(子类)得不到释放的问题
解决:将父类的析构函数声明为虚析构函数
虚析构函数:
析构函数用vritual关键字来进行修饰,表示析构函数是虚析构函数
前提:
父类的指针或引用指向子类时
格式:
virtual ~类名()
{
}
例如:
virtual ~People()//虚析构函数
{
}