一.概念:派生类,基类
Ps:
protected的成员,只能在成员方法中访问
默认继承方式为private
二.实例化方式:
(1)堆中实例化对象:
Worker *p=new Worker();
delete p; //delete手动释放内存,否则内存泄漏
p=NULL; //将指针至于安全状态
(2)栈中实例化对象:
Worker worker;//系统自动释放内存
三.覆盖与隐藏:
(1)覆盖:父类存子类对象
(2)隐藏:同名即可
四.构造函数:
(1)声明:
Worker(int code=0,string name=”jim”);//可以不赋值
(2)定义:
Worker(int code,string name):Person(name) //初始化列表
五.形参—>实参:
(1)p—>p;创建临时对象
(2)P—->&P引用,即别名; 靠“p.”调用成员
(3)&P–>*P指针; 靠“p->”调用成员
ps:
在实例化临时参数对象时,调用的是拷贝构造函数
Person::Person(const Person &)//拷贝构造函数的示例
六.虚析构函数:
(1)引入原因:父类指向堆中的子类对象,在释放内存时,只执行父类析构函数,会造成内存泄漏;
(2)适用:基类
(3)误用弊端:会为类增加一个虚函数表,使得对象的体积翻倍,还有可能降低其可移植性
(4)继承:继承的虚函数在子类中仍是虚函数,可以被覆盖
(5)建议:虽然其子类析构函数也自动为virtual,但建议写上virtual,会更明了一些
七.虚继承:虚继承并没有获得底层子类参数的传递,参数只是顶层父类的默认参数
八.多继承与多重继承的区分
补充
1.””与<>区别:””在当前路径查找文件,<>在默认库中查找文件
2.解决重定义 —-宏定义:
3.Stdlib.h文件下的system(“pause”)让CPU处于等待状态,不能执行其他任务,造成浪费
编程习惯
1.变量命名方法:数据类型+数据意义;eg:iAge,strName (若为属性,则在前面加上m_)
2.利用好protected,private,public的数据权限
3.父类默认构造函数要写,因子类实例化时调用了父类的默认构造函数,除非子类构造函数的初始化列表里写了父类的含参构造函数