继承是面向对象三大特性之一
定义这些类时下级别的成员除了拥有上一级的共性,还有自己的特性
这个时候我们就可以考虑利用继承的技术,减少重复代码
一、继承的基本语法
示例:
#include <iostream>
using namespace std;
class BasePage
{
public:
void header()
{
cout << "首页、分类、查找。。" << endl;
}
void tips()
{
cout << "帮助、合作、站内地图.." << endl;
}
};
class java :public BasePage //class java 继承 class BasePage
{
public:
void content()
{
cout << "java视频页面" << endl;
}
};
class CPP :public BasePage //class CPP 继承 class BasePage
{
public:
void content()
{
cout << "CPP视频页面" << endl;
}
};
void test()
{
java ja;
ja.header(); //通过继承获取到的BasePage类下的成员函数
ja.content();
ja.tips(); //通过继承获取到的BasePage类下的成员函数
CPP cpp;
cpp.header();
cpp.content();
cpp.tips();
}
int main()
{
test();
}
二、继承方式
继承的语法:class 子类(派生类): 继承方式(public、private、portected)父类(基类)
继承方式一共有三种:
- 公共继承
- 保护继承
- 私有继承
三、继承中构造和析构顺序
子类继承父类后,当创建子类对象,也会调用父类的构造函数
问题:父类和子类的构造和析构顺序是谁先谁后?
示例:
#include <iostream>
using namespace std;
class Base
{
public:
Base()
{
cout << "Base构造函数的调用" << endl;
}
~Base()
{
cout << "Base析构函数的调用" << endl;
}
};
class Son :public Base
{
public:
Son()
{
cout << "Son类构造函数的调用" << endl;
}
~Son()
{
cout << "Son类析构函数的调用" << endl;
}
};
void test()
{
Son s;
}
int main()
{
test();
}
四、继承中同名成员处理方式
问题:当子类与父类出现同名的成员,如何通过子类对象,访问到子类或父类中同名的数据呢?
- 访问子类同名成员 直接访问可
-
五、继承同名静态成员处理方式
问题:继承中同名的静态成员在子类对象上如何进行访问?
静态成员和非静态成员出现同名,处理方式一致 访问子类同名成员 直接访问即可
-
六、多继承语法
C++允许一个类继承多个类
语法:class 子类 : 继承方式 父类1 ,继承方式 父类2…….
多继承可能会引发父类中有同名成员出现,需要加作用域区分
C++实际开发中不建议用多继承七、菱形继承
概念:两个派生类继承同一个基类,又有某个类同时继承这两个派生类,这种继承被称为菱形继承,或者钻石继承。
菱形继承的问题: 羊继承了动物的数据,驼同样继承了动物的数据,当羊驼使用数据时,就会产生二义性
- 羊驼继承自动物的数据继承了两份,其实我们应该清楚,这份数据我们只需要一份就可以
利用虚继承来解决,加virtual
示例:
class Animal{};
class sheep : virtual public Animal{};
class tuo : virtual public Animal{};
class sheeptuo : public sheep,public tuo;