C++继承[详细]
来源:互联网 发布:鲜活的数据 编辑:程序博客网 时间:2024/05/22 17:21
1.继承概念
所谓继承,就是在已有类上派生出新类(派生类或子类),保持原有类特性的基础上进行扩展,增加新功能,被继承的类叫做基类(或父类),产生的新类叫做派生类(或子类)。
2.继承定义格式
class 派生类名称:继承类型(public,protected,private) 基类(父类)名称
举例:
class Base{public:void show(){cout << "_a=" << _a << endl;cout << "_b=" << _b << endl;cout << "_a=" << _c << endl;}public:int _a;protected:int _b;private:int _c;};class Derived :public Base{public:void Derived_show(){cout << "_e=" << _e << endl;cout << "_f=" << _f << endl;cout << "_g=" << _g << endl;}public:int _e;protected:int _f;private:int _g;};
3.访问限定符
总结:
(1)公有继承实现的是一个接口继承,基类可用的成员派生类也可用。
(2)保护继承和私有继承是一个实现继承,基类的部分成员并非完全成为派生类接口的一部分。绝大多数场景中使用的是公有继承。
(3)基类的私有成员在派生类中不可访问,保护继承可以使得基类成员能在派生类内访问,但不能在类外访问。由此可见,保护成员限定符是因继承才出现的。
(4)三种继承方式,都允许在派生类内部访问基类公有成员和保护成员,基类的私有成员均不允许访问,即不可见。
(5)关键字class默认的继承方式是private,关键字struct默认的继承方式是public,但是建议一般情况下将继承方式给出来。
4.派生类的默认成员函数
继承关系中构造函数的调用顺序:
派生类对象--->派生类构造函数列表--->基类构造函数--->派生类构造函数
继承关系中析构函数的调用顺序:
析构派生类对象--->派生类析构函数列表--->基类析构函数--->派生类析构函数
举个例子:
class Test1{public:Test1(int data){}~Test1(){}};class Test2{public:Test2(int data){}~Test2(){}};class Base1{public:Base1(int data) : _data(data){}~Base1(){}protected:int _data;};class Base2{public:Base2(int data) : _data2(data){}~Base2(){}protected:int _data2;};class Derive : public Base1, public Base2{public: //Derive(): Base1(0), Base2(1),t1(3), t2(4)//按照顺序//Derive(): Base2(0), Base1(1),t2(3), t1(4)//B1-->构造函数-->B2--->//Derive(): t1(3), t2(4), Base1(0), Base2(1)Derive() : t2(3), t1(4), Base2(0), Base1(1){}~Derive(){}protected:Test1 t1;Test2 t2;};
构造函数调用顺序:1.Derive(): Base1(0), Base2(1),t1(3), t2(4)
派生类Derive构造函数列表--->基类Base1构造函数--->基类Base2构造函数--->派生类Derive构造函数--->t1构造函数--->派生类Derive构造函数--->t2构造函数--->派生类Derive构造函数
2.Derive(): Base2(0), Base1(1),t2(3), t1(4)
3.Derive(): t1(3), t2(4), Base1(0), Base2(1)
4.Derive() : t2(3), t1(4), Base2(0), Base1(1)
派生类Derive构造函数列表--->基类Base1构造函数--->派生类Derive构造函数--->基类Base2构造函数--->派生类Derive构造函数--->t1构造函数--->派生类Derive构造函数--->t2构造函数--->派生类Derive构造函数
5.继承体系中的作用域
(1)在继承体系中,基类和派生类是在两个不同的作用域。
(2)派生类和基类中有相同的成员或成员函数,派生类成员将屏蔽基类对成员的访问,即同名隐藏。一般情况下,避免基类的成员和成员函数和派生类成员和成员函数相同。
6.赋值兼容规则(public继承)
(1)子类对象可以赋值给父类对象
(2)父类对象不可以赋值给子类对象
(3)父类的指针/引用可以指向子类对象
(4)子类的指针/引用不可以指向父类对象,但可以通过强制类型转换
7.友元函数&继承
友元关系不可以继承,即基类友元不能访问子类私有成员和保护成员。
8.静态成员&继承
基类中有一个静态成员,无论派生多少个子类,静态成员都是唯一的,不会发生改变。
9.继承方式
(1)单继承
class Base{public:int _a;};class D1 :public Base{public:int _c;};class D2 :public Base{public:int _d;};
(2)多继承
class B1{public:int _a;};class B2{public:int _b;};class D :public B1,public B2{public:int _c;};
(3)菱形继承
class B{public:int _a;};class C1 :public B{public:int _c;};class C2 :public B{public:int _d;};class D :public C1, public C2{private:int _e;};
(4)虚继承
解决二义性问题。
class Base{public:int _b;int _c;};class Derived :virtual public Base{public:int _d;};int main(){Derived b;b._b = 0;b._c = 1;b._d = 2;system("pause:");return 0;}
- Object-C详细编程(二)—封装,继承,多态
- c++ 继承(详细)
- 继承详细介绍
- Java继承详细讲解
- java继承[详细]
- C++继承[详细]
- c继承
- C++----------------继承
- 【c#】继承
- C++:继承
- C++::继承
- [C++]继承
- 【C++】继承
- 【C#】继承
- 【c++】继承
- 【C++】继承
- c#-继承
- 【C++】 继承
- 3242: [Noi2013]快餐店
- uva 225 Golygons
- 和研究生博士学长聊天有感
- docker容器 最简单的java演示实例
- 判断数独是否合法-LintCode
- C++继承[详细]
- 文件管理,系统管理,系统安全常用指令整理
- 数据结构——图的广度优先搜索模板
- some tips about python One
- vue 计算属性 底部导航处理
- 影响mysql性能因素硬件、操作系统
- 数据结构-栈的基本操作
- Android -- 系统start Service流程简要分析
- node mysql搭建个人网站总结