c++继承--这就是c++里面最有魅力的东西
Posted Heisenberg_Posion
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++继承--这就是c++里面最有魅力的东西相关的知识,希望对你有一定的参考价值。
文章目录
1.继承的应用——为什么要用继承
类与类之间存在着关系,比如说鱼这个类,下级里有草鱼,青鱼等等,然后每种鱼都有它自己的一些特性,定义这些类时,发现下级别的成员除了拥有上一级的共性,还有自己的特性。这时可以用继承的技术来减少重复的代码。
#include<iostream>
using namespace std;
//继承的语法:
// class 子类 :public 父类 子类也可以称为派生类,父类也可以称为基类
//子类中的属性有继承过来的,还有自己增加的成员
class dog
public:
int m_age = 0;
int m_height = 15;
void printMessage()
cout << m_age << " " << m_height << endl;
;
class dog_X :public dog
public:
int m_radious = 50;
void printfMe()
cout << m_radious << endl;
;
int main()
dog_X sj;
sj.printfMe();
sj.printMessage();
return 0;
2.继承方式
根据属性权限可以分为,公共继承,保护继承,私有继承。
首先知道无论哪种继承方式,都不能继承父类的私有权限属性。
这里说明一下这里的不能继承是指不可见,虽然确确实实被继承过来了,但我们不能访问,所以我写成了不能继承。
公共继承,子类继承父类的各个属性的权限不变。
保护继承,子类继承父类的公共权限变为保护权限,保护权限不变。
私有继承,子类继承父类的公共权限和保护权限都变为私人权限。
#include<iostream>
using namespace std;
class father
public:
int m_apple;
protected:
int m_watermelon;
private:
int m_pear;
;
class son1 :public father //继承语法
void func()
m_apple = 10;
m_watermelon = 20;
//m_pear =30 没有继承到父类中的私人权限
;
3.继承中的对象模型
虽然继承不到父类的私人权限,但是子类的对象模型里面会有父类的所有非静态成员属性,父类中的私有成员权限是被编译器隐藏了,但是确实是继承下去了,新建对象的空间大小就得考虑这个。
4.继承中的构造和析构顺序
创建一个子类的对象时,也会调用父类的构造函数
先构造父类,然后构造子类,生活常识,先有父亲,再有儿子。
再记住析构顺序与构造相反。
5.继承中父类和子类同名成员的处理
子类对象下访问子类的属性,直接访问就好了,如果要访问父类中的同名属性,加上作用域就好了。
当子类与父类拥有同名的成员函数,子类会隐藏父类中所有版本的同名成员函数
如果想访问父类中被隐藏的同名成员函数,需要加父类的作用域
这两种处理方式很容易理解,如果我要调用一个函数,如果我自己有的话,我就不会去我继承的那个地方去找。
6.继承同名静态成员处理方式
和非静态成员处理方式是一致的。
class Base
public:
static void func()
cout << "Base - static void func()" << endl;
static void func(int a)
cout << "Base - static void func(int a)" << endl;
static int m_A;
;
int Base::m_A = 100;
class Son : public Base
public:
static void func()
cout << "Son - static void func()" << endl;
static int m_A;
;
int Son::m_A = 200;
//同名成员属性
void test01()
//通过对象访问
cout << "通过对象访问: " << endl;
Son s;
cout << "Son 下 m_A = " << s.m_A << endl;
cout << "Base 下 m_A = " << s.Base::m_A << endl;
//通过类名访问
cout << "通过类名访问: " << endl;
cout << "Son 下 m_A = " << Son::m_A << endl;
cout << "Base 下 m_A = " << Son::Base::m_A << endl;
//同名成员函数
void test02()
//通过对象访问
cout << "通过对象访问: " << endl;
Son s;
s.func();
s.Base::func();
cout << "通过类名访问: " << endl;
Son::func();
Son::Base::func();
//出现同名,子类会隐藏掉父类中所有同名成员函数,需要加作作用域访问
Son::Base::func(100);
int main()
//test01();
test02();
system("pause");
return 0;
总结:同名静态成员处理方式和非静态处理方式一样,只不过有两种访问的方式(通过对象 和 通过类名)
## 7.多继承
**一个类继承多个类**
语法:class 子类 :继承方式 父类1 , 继承方式 父类2...
多继承可能会引发父类中有同名成员出现,需要加作用域区分,不太使用多继承
以上是关于c++继承--这就是c++里面最有魅力的东西的主要内容,如果未能解决你的问题,请参考以下文章