继承是一种机制,目的是实现代码复用的同时减少重复代码量。它允许程序员在保持原有类特性的基础上进行功能的拓展。这样产生的新类叫做派生类,被继承的类叫做基类。
下面可以看一个实例:
class Animal {
int age;
};
class Cat :public Animal {
string name;
};
首先创建了一个Animal类,之后创建了一个Cat类。Cat类用public的方式继承了Animal类中所有特性。
再举一个例子,某公司创建一个职工管理系统。一个职工就是一个类的对象所有职工都有姓名、编号等属性。但是不同部门的职工可能有其它部门没有的特性。这时可以把公共属性封装为基类,然后创建含有特性且继承了基类的派生类。
class 派生类名:继承方式{类成员}
一共有三种,分别是public、protected、private
基类中public成员 | 基类中protected成员 | 基类中private成员 | |
public继承 | public | protected | private |
protected继承 | protected | protected | private |
private继承 | private | private | private |
1、基类中的private继承权限的属性,无论以何种方式继承,在派生类中都是不可见的(依然被继承到了派生类当中,但是无论类内类外都无法访问)。
2、如果想让一个基类中的成员被继承后可以类内访问,不可以类外访问,那么这个成员访问权限应该设为protected,并且继承方式设置为public或protected
3、对于private继承方式,继承到的public、protected权限的成员都会成为private权限,只能类内访问
4、使用class时默认访问权限和默认继承方式都是private,使用struct则是public
#include<iostream>
using namespace std;
class Animal {
public:
int age=3;
string sex="雄";
};
class Cat :public Animal {
public:
string m_name = "小白";
};
int main() {
Animal a;
Cat b;
a = b;
b = a;
system("pause");
return 0;
}
这里赋值有一个切片原则,派生类的成员一般比基类多,所以将派生类赋值给基类时,忽略掉多出部分。基类赋值给派生类时,由于成员少,传给派生类的成员少,所以会报错。
简单总结就是:派生类可以赋值给基类,基类不可以赋值给派生类。
具体赋值时,可以通过:
1、=符号赋值
Animal a;
Cat b;
a=b;
2、通过引用赋值
Cat a;
Animal &b=a;
3、通过指针赋值
Cat a;
Animal*b=&a;
有时候基类和派生类中定义有同名的成员变量,此时编译器以派生类优先,如果想访问基类中的同名的成员变量,应该表明作用域,用:基类名::成员变量访问。
基类和派生类中定义有同名的成员函数,构成函数的隐藏。即隐藏基类中的同名函数,默认为派生类中的成员函数。如果想 调用基类中的成员函数,应表明作用域。基类名::成员函数(参数)访问。
成员函数的隐藏,只需要同名就可构成,对参数表没有要求。
1、构造函数:
派生类继承了基类,创建一个派生类对象时,相当于创建一个基类对象与派生类的特性。创建时,默认先调用基类的构造函数,再调用派生类的构造函数。
所以,务必保证基类的构造有效。如果基类构造失效,必须在派生类构造函数中为基类部分初始化。
基类构造失效,是指基类中的成员没有全部被初始化。(一般而言,如果基类构造函数没有默认参数给基类成员初始化,那么一般都要在子类构造函数中初始化基类部分)
2、析构函数:
与构造函数相反,一个派生类对象被析构时,先调用派生类自己的析构函数,再调用基类的析构函数。
所以,不要在派生类中调用基类的析构函数。如果调用了,那么基类会被析构两次。
3、拷贝构造:
派生类中调用基类的拷贝构造函数时,直接传入子类对象即可(切片原则)。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- yule263.com 版权所有 湘ICP备2023023988号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务