继承,是面向对象三大特性之一
继承的基本语法#include#include using namespace std; class BasePage { public: void header() { cout << "首页,公开课,登录,注册..." << endl; } void footer() { cout << "帮助中心,交流合作,站内地图..." << endl; } void left() { cout << "Java,python,c++..." << endl; } void content() { cout << "Java学科视频" << endl; } }; //Java页面 class Java :public BasePage //核心语句 { public: void content() { cout << "Java学科视频" << endl; } }; //C++页面 class CPP :public BasePage //核心语句 { public: void content() { cout << "CPP学科视频" << endl; } }; void test01() { Java ja; ja.header(); ja.footer(); ja.left(); ja.content(); CPP cpp; cpp.header(); cpp.footer(); cpp.left(); cpp.content(); } int main() { test01(); return 0; }
继承的好处:减少重复代码
语法: class 子类: 继承方式 父类
子类 也称为 派生类
父类 也称为 基类
派生类的成员,包含两大部分:一类是从基类继承过来的,一类是自己增加的成员.
相同点:三种继承访问均不可以访问父类中的私有成员
- 公共继承
父类中的公共成员继承为自身公共成员,父类中的保护成员继承为自身保护成员 - 保护继承
父类中的公共成员和保护成员继承为自身保护成员 - 私有继承
父类中的公共成员和保护成员继承为自身私有成员
父类中所有非静态成员属性都会被子类继承下去
父类中私有成员属性是被编译器给隐藏了,因此是访问不到,但确实被继承了
子类继承父类后,当创建子类对象,也会调用父类的构造函数和析构函数
顺序是 父类构造—子类构造—子类析构—父类析构
问题:当子类与父类出现同名的成员,如何通过子类对象,访问到子类或者父类中同名的数据
- 访问子类同名成员 直接访问即可
- 访问父类同名成员 需要加作用域(.Base:
如何调用父类中同名成员函数
如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中所有同名成员函数
如果想访问父类中被隐藏的同名成员函数,需要加作用域
C++允许一个类继承多个类
语法:class :子类 继承方式,子类 继承方式
当父类中出现同名成员,需要加作用域区分(.Basex:
概念:两个派生类继承同一个基类,又有某个类同时继承两个派生类
#include#include using namespace std; //利用虚继承可以解决菱形继承的问题 //继承前加上关键字virtual变为虚继承 //Animal类称为 虚基类 class Animal { public: int m_age; }; class Sheep :virtual public Animal { }; class Tuo :virtual public Animal { }; class SheepTuo :public Sheep, public Tuo { }; void test01() { SheepTuo st; //当菱形继承,;两个父类拥有相同的数据,需要加以作用域区分 st.Tuo::m_age = 28; st.Sheep::m_age = 18; cout << st.Tuo::m_age << st.Sheep::m_age << endl; } int main() { test01(); return 0; }
总结:菱形继承会造成子类继承两份相同数据,造成资源浪费,须使用虚继承解决



