目录
一、什么是继承?
继承是面向对象软件技术当中的一个概念。这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
简单的理解: 儿子从父亲中把资源给继承(拷贝)过来。 儿子就不需要重复实现父类的功能接口。 作用:提高代码的复用性。
二、继承的语法
class 派生类名 : 继承方式 基类名 {
};
1、继承的权限问题:
public: //公共成员 : 所有人都可以访问, 类内,类外,子类(派生类) 。
protected: //保护成员 : 类内 和 子类(派生类) 可以访问 。
private: //私有成员 : 类内可以访问。
2、访问基类(父类)的私有成员:
(1).在公共区设计一个接口,提供子类访问 。
(2).在保护区设计一个接口,提供子类访问 。
(3).把私有成员设置为保护或共有属性 (不推荐,破坏成员属性)。
//demo1类的继承
#include<iostream>
using namespace std;
//定义一个昆虫基类
class insect{
public:
void fly(){
cout << "我在飞" << endl;
}
void climb(){
cout << "我们在爬" << endl;
}
int go; //基类的公共属性
private: //私有属性,子类不能访问
int run;
};
//继承昆虫类,蝴蝶
class butterfly : public insect{
public:
void gather_honey(){
cout << "我是蝴蝶在采蜜" << endl;
}
void pollination(){
cout << "我在传粉" << endl;
}
private:
char color[10]; //颜色
char variety[10]; //品种
};
//继承基类,蚂蚁
class ant : public insect{
public:
void move_house(){
cout << "我是蚂蚁在搬家" << endl;
}
private:
int move;
};
int main()
{
butterfly a;
a.gather_honey();
a.pollination();
a.fly();
ant b;
b.move_house();
b.climb();
b.go = 11;
cout << "我们蚂蚁有:"<<b.go<<"个" << endl;
}
//demo2类继承的属性
#include <iostream>
using namespace std;
class base
{
public: //公共成员 : 所有人都可以访问, 类内,类外,子类(派生类)
protected: //保护成员 : 类内 和 子类(派生类) 可以访问
void show()
{
cout << this->a << endl;
cout << this->b << endl;
cout << this->c << endl;
}
void set(int a,int b,int c)
{
this->a = a;
this->b = b;
this->c = c;
}
private: //私有成员 : 类内可以访问
int a;
int b;
int c;
};
class xbase : public base
{
public:
//设置base 中的数据成员
void set_base(int a,int b,int c)
{
this->set(a,b,c);
}
//显示 base 中的数据成员
void show_base()
{
this->show();
}
};
//外人,别人
int main()
{
xbase t;
t.show_base();
t.set_base(1,2,3);
//t.show();
t.show_base();
}
三、继承中的构造函数
1、派生类想使用无参构造,那么在基类也要定义无参构造。
2、如果派生类(子类)的有参构造函数没有传参到基类(父类)的有参构造函数中,那么在主函数定义的派生类(子类)的对象时,只会调用基类(父类)无参构造函数。
3、派生类继承的参数列表初始化格式:(传参格式)
基类(父类): class Person { Person(int age,const char *name){ } };
派生类(子类): class Student : public Person{
Student(const char *name,int age) : Person(age,name) {
} };
4、派生类和基类函数重名,优先使用派生类的函数。
5、可以用域操作符"::"实现派生类调用基类函数。 Person :: show_init(); //派生类访问基类的show_init()函数。
四、继承总结
1、class Student : public Person{ }; //相当于把Person(父类)放入Student(子类)的公共区。
2、class Student : protected Person{ }; //相当于把Person(父类)放入Student(子类)的保护区。
提示:假设没有填写继承方式,默认的方式是 私有继承!
3、继承中的参数列表初始化:格式:构造函数(形参):数据成员(形参),类名(参数)。
4、继承中的参数列表初始化: 三种继承方式有什么不同?
(1)不管哪种继承方式,都不会影响"子类"对"父类"的访问权限。 (子类可以访问父类的 保护和公用成员)。
(2)不同的继承方式,只会影响类外访问基类的权限(类外只能访问基类的,公有继承的公有成员) 。
(3)不同的继承方式,就相当于把基类放入派生类的对应区域。 (再根据公共,保护,私有的权限方式思考即可!)