C++之继承
一、三种继承方式
无论哪种继承方式,父类中private都继承到子类中不可见位置,无法通过子类函数访问。
1.公有继承
公有继承private限定符:
2.保护继承
3.私有继承
二、继承中的特殊关系——隐藏与is A
1、隐藏
子类public继承父类,子类中有成员函数与父类的同名但是参数不同的情况下,无法进行重载;父类的同名函数依旧会被隐藏;
子类.函数();调用的是子类中的成员函数,子类.父类::函数();调用的是父类的成员函数,同理同名数据成员。
2、Is a
父类的指针指向子类对象的时候 只能访问子类中父类原有的数据成员和成员函数,而无法访问子类中独有的数据成员和成员函数
子类对象向父类对象赋值。或用子类对象初始化父类对象,本质是将子类当中从父类继承下来的数据成员赋值给父类对象,而其他的数据将会被截断,丢失。
父类指针指向子类对象。父类指针只能访问父类原有的成员。
三、多继承与多重继承
c++对象的初始化顺序是:
(a) 基类初始化
(b) 对象成员初时化
(c) 构造函数的赋值语句
假设 class C : public A, public B
{
D d;
};
则初始化的顺序是A, B, D, C的构造函数。
这里基类的初始化顺序是按照声明的顺序, 成员对象也是按照声明的顺序。 因此 C(int i, int j) : B(i), A(j) {} //这里成员初始化列表的顺序是不起作用的
析构函数的顺序则刚好是调过来, 构造/析构顺序可看作是一种栈的顺序。
四、虚继承
例子:
补充说明:
虚继承(编码二)
老师:在虚继承情况下,作为菱形继承最顶层的父类并没有进行参数传递,也就是说参数只使用了顶层父类的默认参数而无法从子类当中获得传入的参数。
课程评论:
首先virtual词典里解释为本质上存在但是没有表现形式,而C++中 注意 virtual 写在了共有继承前面,意思就是在继承时是真实存在但是不能被访问;
换句话说,你在实例化对象MigrantWorker时需要实例化Farmar和Worker,而实例化这两个对象需要先实例化一个Person,那么传入值你选谁的?
所以系统此时设置为禁止访问,在对象生成后你可以随便访问,因为你不可能通过两种方式同时访问一个对象内的成员。
采用初始化列表的方式来赋值,Per实例化时是不能被访问的因此值传不进去,如果你Far和Wor的构造函数体内用 m_strColor=color是可以改的。因为执行有先后顺序,不冲突。