-
私有继承:
查看全部 -
保护继承:
查看全部 -
control + k + c——多行注释
control + k + u——解除多行注释
查看全部 -
公有继承:
查看全部 -
C++中的继承关系是概念上的父子关系,不是个体的父子关系。
查看全部 -
释放动态空间后,指针一定要指向空
注意有参构造,在实例化时
子类构造时,初始化列表 父类也要初始化
初始化列表先于构造函数执行
查看全部 -
棱形继承时,未避免执行两次顶层父类的构造函数,引入虚继承
person > worker
> migrantWorker
person > farmer
(1)不是虚继承的情况下,实例化子类对象的时候,要分别执行其2个父类的父类构造函数,再分别执行2个父类的构造函数,因为继承关系中,必须实例化父类对象后(执行父类的构造函数)才能实例化子类对象(执行子类的构造函数),销毁的时候也要分别执行这个子类2个父类的析构函数及父类各自的父类的析构函数。
(2)用了虚继承后只执行一次爷爷构造函数一次爸爸构造函数(2个爸爸构造函数都只执行一次)一次孙子构造函数,爷父孙析构函数也是只执行一次。
但是,在进行虚继承时,作为菱形继承最顶层的父类并不能进行参数的传递,也就是说参数只使用了顶层父类的默认参数而无法从子类当中获得传入的参数。 虚继承的好处是使底层的类实例化的对象当中只有一份顶层类的数据。
查看全部 -
1、多重继承
A为B的父类,B为C的父类,则称C为多重继承
当实例化C时,先调用A的构造函数,再调用B,最后调用C
释放空间时,按照构造函数调用顺序逆序进行
2、多继承
A、B均为C的父类
构造函数调用时依次调用定义的父类,在调用子类,释放空间时逆序进行
多继承时:
(1)子类的构造函数要用初始化列表的方式初始化从父类继承过来的成员列表;
(2)实例化子类对象的时候,先执行父类的构造函数,父类的构造函数的执行顺序按照初始化成员列表的先后顺序执行,再执行子类的构造函数。 析构函数的执行顺序和构造函数的执行顺序相反
补充:
用初始化列表比较好的情况:传给构造函数的值要分别传给几个父类构造函数的时候,用 const 修饰的成员的时候,还有就是对象成员初始化的时候。
查看全部 -
"isA":是共有继承下的子类与父类之间的关系。
概念上,子类也是父类,可以利用子类对父类进行实例化,初始化,赋值等操作。但反过来不可。销毁父类时引入virtual虚析构函数。
(1)当一个子类的对象去初始化或者对一个父类的对象赋值时,本质上就是把子类从父类所继承下的数据成员赋值给父类的原有的数据成员,此时子类对象的其他数据成员就会丢失
(2)若是父类的一个对象指针指向一个子类的对象,则访问,也只能访问到从父类继承下来的数据成员。(本质上都是在访问自己数据成员所在的内存空间,人为概念上区分了,但是硬件本质上操作的还是同一块内存区域)
//Person为父类,Worker为子类 Person *p=new Worker; p->eat(); delete p; p=NULL//只是释放Person类,可能会造成worker类内存泄漏
(1)用子类实例化父类时,先调用父类构造函数,再调用子类构造函数
(2)销毁时只释放父类内存,可能造成子类内存的泄露,因此,引入virtual虚析构函数,virtual可以继承下去,即便子类中不写该关键字也是虚析构函数,这样在销毁父类时,会先销毁子类,再销毁父类。
“has a”代表的是对象和它的成员的包含关系。c++还有另一种实现has-a关系的途径----私有继承。使用私有继承,基类的公有成员和保护成员都将成为派生类的私有成员。这意味着基类方法将不会成为派生对象公有接口的一部分,但可以在派生类的成员函数中使用它们。因此私有继承提供的特性与包含相同:获得实现,但不获得接口。所以,私有继承也可以用来实现has-a关系。
查看全部 -
1\公有成员可以直接访问,可以间接通过自身类的公有函数访问,也可以通过子类的公有函数访问
2\保护成员不可以直接访问,可以间接通过自身类的公有函数访问,也可以通过子类的公有函数访问
3\私有成员不可以直接访问,可以间接通过自身类的公有函数访问,不可以通过子类的公有函数访问
查看全部 -
使用虚继承时虽然不会重复调用最顶层父类的构造函数和析构函数,但参数只能使用最顶层父类默认值,而无法从子类中获得传入的值
查看全部 -
多个文件里包含同一个头文件,会报错重定义,此时用
#ifdef 全大写
#define 全大写
代码段
#endif
宏定义解决多重定义的问题
查看全部 -
关键字 virtual
查看全部 -
类D多继承的父类B,C来自同一个父类A,此时类D中会有两份相同A的数据,这是不被允许的,此时要用虚继承解决。
virtual虚继承:
解决菱形继承或者其它复杂继承关系中多次实例化同一父类的问题
查看全部 -
通过test1、test2、test3的对比,发现test1在调用时会产生临时对象(临时变量),而test2、test3则不会产生临时对象,所以效率更高
查看全部
举报