C++继承机制
目录
继承
继承基本语法
继承方式
构造和析构顺序
同名成员处理
多继承语法
菱形继承
继承
下级别的成员拥有上一级的共性,还有自己的特性
继承基本语法
子类也称为派生类
父类也称为基类
#include<iostream> using namespace std; class BasePage{ public: void header(){ cout <<"首页,公开课,登录,注册,"<<endl; } void footer(){ cout <<"帮助中心,合作交流"<<endl; } void left(){ cout <<"Java,Python,C++,网络安全与运维"<<endl; } }; class Java:public BasePage{ public: void content(){ cout <<"Java学科视频"<<endl; } }; int main(){ cout <<"Java下载视频页面如下"<<endl; Java ja; ja.header(); ja.left(); ja.footer(); ja.content(); return 0; }
继承方式
public
protected
private
父类private的内容任何继承都拿不到
在private继承中继承的内容都变为private
在protected继承中的内容都变为protected
构造和析构顺序
#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 test01(){ Son s; } int main(){ test01(); return 0; }
同名成员处理
有同名不加修饰的调用的是子类的
#include<iostream> using namespace std; class Base{ public: Base(){ m_A=100; } int m_A; }; class Son:public Base{ public: Son(){ m_A=200; } int m_A; }; void test01(){ Son s; cout <<s.m_A<<endl; cout <<s.Base::m_A<<endl; } int main(){ test01(); return 0; }
#include<iostream> using namespace std; class Base{ public: void func(){ cout <<"Base的func调用"<<endl; } }; class Son:public Base{ public: void func(){ cout <<"Son的func调用"<<endl; } }; void test01(){ Son s; s.func(); s.Base::func(); } int main(){ test01(); return 0; }
多继承语法
class 子类:继承方式 父类1,继承方式 父类2{ }
多继承可能会引发父类中的同名成员出现,需要加作用域区分
#include<iostream> using namespace std; class Base1{ public: Base1(){ m_A=100; } int m_A; }; class Base2{ public: Base2(){ m_B=200; } int m_B; }; class Son:public Base1,public Base2{ public: int m_C; int m_D; }; void test01(){ } int main(){ test01(); return 0; }
菱形继承
两个派生类继承同一个基类
又有某个类同时继承了这两个派生类
这种继承被称为菱形继承,或者钻石继承
当出现菱形继承的时候,两个父类拥有相同的数据,需要加以作用域区分
利用虚继承 解决菱形继承的问题
#include<iostream> using namespace std; class Animal{ public: int m_Age; }; class Sheep:virtual public Animal{ }; class Camel:virtual public Animal{ }; class alpaca:public Sheep,public Camel{ }; int main(){ alpaca a; a.Sheep::m_Age=28; a.Camel::m_Age=18; cout <<a.Sheep::m_Age<<endl; cout <<a.Camel::m_Age<<endl; return 0; }