继承

同种动物有自己的共性,又有自己的个性
有一些类具有同样的共性,但同时又有自己的个性,这时候就需要继承一些类的特性来减少重复的代码量。
继承可以减少重复的代码
class A :pubilc B;
B为父类/基类
A为子类/派生类

A类拥有父类的所有,同时又有自己的新的特性

一、继承的定义

#include<iostream>
#include<vector>
#include<string>
using namespace std;
class plant{public:void need(){cout << "I need so much sum,water,solid." << endl;}
};
class daisy:public plant{//public : class plant;这个不是继承的语法,继承的语法要写在声明以后。public:void iam(){cout << "I am daisy." << endl;}
};
int main(void){daisy d1;d1.need();d1.iam();
}

二、三种继承类型

公共继承

#include<iostream>
#include<vector>
#include<string>
using namespace std;
class Base{public:int data1 = 1;protected:int data2 = 2;private:int data3 = 3;
};
class Son1:public Base{public://将上面的东西改成private,这些事情在子类就访问不到。推测在子类中是可以对父类的权限的私有性质进行加强来着,void func1(){cout << data1 << endl;cout << data2 << endl;//父类的保护权限,子类拿的到,只是在类外没有办法修改来着//cout << data3 << endl;//父类的私有权限,子类拿不到}
};
int main(void){Son1 s1;s1.func1();s1.data1 = 10;return 0;
}

保护继承

#include<iostream>
#include<vector>
#include<string>
using namespace std;
class Base{public:int data1 = 1;protected:int data2 = 2;private:int data3 = 3;
};
class Son1:protected Base{public://即使是在类的内部设置成public,也没有办法改变类的继承权限所决定的方式。void func1(){cout << data1 << endl;cout << data2 << endl;//父类的保护权限,子类拿的到,只是在类外没有办法修改来着//cout << data3 << endl;//父类的私有权限,子类拿不到}
};
int main(void){Son1 s1;s1.func1();s1.data1 = 29;cout << s1.data1 << endl;//s1.data1 = 10;return 0;
}

私有继承

#include<iostream>
#include<vector>
#include<string>
using namespace std;
class Base{public:int data1 = 1;protected:int data2 = 2;private:int data3 = 3;
};
class Son1:private Base{//private权限继承的,即使是后面改成了公共的权限,也没有办法改变其私有的性质public:void func1(){cout << data1 << endl;cout << data2 << endl;//父类的保护权限,子类拿的到,只是在类外没有办法修改来着//cout << data3 << endl;//父类的私有权限,子类拿不到}
};
int main(void){Son1 s1;s1.func1();return 0;
}

多级继承,多级继承可以更改权限吗?
比如在上一级里面是public的,我想在这一级里面改成私有的。

#include<iostream>
#include<vector>
#include<string>
using namespace std;
class Base{public:int data1 = 1;protected:int data2 = 2;private:int data3 = 3;
};
class Son1:public Base{public:void func1(){cout << data1 << endl;//cout << data2 << endl;//父类的保护权限,子类拿的到,只是在类外没有办法修改来着//cout << data3 << endl;//父类的私有权限,子类拿不到}// private:// data2 = 10;
};
class gradson1:public Son1{public:void func1(){cout << data1 << endl;cout << data2 << endl;}
};int main(void){Son1 s1;s1.func1();gradson1 gs1;gs1.data1;gs1.func1();return 0;
}

对象继承后的特性
1.父类中的所有对象都被继承下去了,非静态成员的大小都算在子类的大小里面,私有变量也算,只是被编译器隐藏了罢了。

2、继承中先调用父类的构造函数,再调用子类的构造函数,析构的顺序与构造的顺序相反。

3、如果出现父类和子类同同名的函数,访问父类的成员(静态成员和非静态成员)需要通过作用域,函数重载也是一样

#include<iostream>
using namespace std;
class base{public:int a1;void fun(){cout << "base : fun()" << endl;}void fun(int a){cout << "base : fun(int a)" << endl;}base(){a1 = 10;}
};
class son:public base{public:int a1;void fun(){cout << "son : fun()" << endl;}son(){a1 = 11;}
};
int main(void){son s1;cout << s1.a1 << "  " << s1.base::a1 << endl;s1.fun();s1.base::fun();s1.base::fun(10);return 0;
}

多继承语法
class 类名 :继承方式 父类1,继承方式 父类2,、、、
如果父类中有重复的名称的变量,就需要加作用域来进行访问。

#include<iostream>
using namespace std;
class base1{public:int a;base1(){a = 10;}
};
class base2{public:int a;base2(){a = 100;}
};
class son : public base1,public base2{public:int a;son(){a = 11;}
};
int main(void){son s1;cout << s1.a << endl;cout << s1.base1::a << endl;cout << s1.base2::a << endl;return 0;
}

菱形继承
两个派生类继承了一个基类
某个类继承了两个派生类
问题在于,两个派生类有同样的数据,会在某个类当中重复会造成资源浪费。
解决方法:使用虚继承。

重复的数据要指明是哪个派生类:

解决方法:在类名上加上virtual

#include<iostream>
using namespace std;
class base{public:int a;
};
class son1:virtual public base{};
class son2:virtual public base{};
class grandson:public son1,public son2{};
int main(void){grandson gs;gs.a = 10;cout << gs.a << endl;return 0;
}

虚继承的原理

只保有一份数据,派生类继承了指针,每个派生类继承的指针指向虚拟基类的表格,表格中有偏移量,指针的地址加上表格中的偏移量就可以找到具体数据所放置的位置。
此时依然可以通过派生类的作用域对该数据进行访问,但是访问到的都是同一份数据。

2021-08-14c++面向对象的三大特性之二——继承相关推荐

  1. 到底什么是面向对象,面试中怎么回答。面向过程和面向对象的区别是什么。java跨平台特性以及java和C++的区别。面向对象的三大特性——封装、继承和多态。面向对象的高拓展性以及低耦合度怎么体现?

    Java语言具有的特点:面向对象.跨平台.多线程以及网络编程 1. 和C++的区别 1.1 Java隐蔽了C++的指针,避免指针直接操作,程序更加安全. 1.2 Java类继承只能单继承,避免了C++ ...

  2. Python Day 21 面向对象 (面向对象的三大特性(二)继承,多态,封装,几个装饰器函数)...

    Python Day 21 面向对象 (面向对象的三大特性(二)继承,多态,封装,几个装饰器函数) https://mubu.com/doc/1AqL_M0IbW 继承之钻石继承 多态 封装 几个装饰 ...

  3. 面向对象的三大特性------封装、继承、多态

    一.封装 1.封装的思想 1.1封装的概述 封装是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些 ...

  4. C#面向对象三大特性之二:继承

    面向对象的三大特性之一的封装,解决了将对同一对象所能操作的所有信息放在一起,实现统一对外调用,实现了同一对象的复用,降低了耦合. 但在实际应用中,有好多对象具有相同或者相似的属性,比如有一个对象 果树 ...

  5. Java学习笔记二十五:Java面向对象的三大特性之多态

    Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...

  6. 面向对象的三大特性之继承

    # 面向对象的三大特性之继承# 当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好 (如机器人) # 当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好 (动物-- ...

  7. 面向对象三大特性之一:继承(C++)

    目录 继承的定义 基类对象和派生类对象的赋值转换 继承中的作用域 派生类与基类中成员的关系 派生类与默认成员函数的关系 继承与友元的关系 继承与静态成员的关系 面向对象的三大特性:封装,继承,多态. ...

  8. 面向对象之三大特性:继承,封装,多态

    python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分 ...

  9. polymorphism java_Java基础-面向对象第三大特性之多态(polymorphism)

    Java基础-面向对象第三大特性之多态(polymorphism) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 多态是继封装,继承之后,面向对象的第三大特性,多态的 ...

最新文章

  1. 长沙网络推广教你如何在网站优化中让URL标准化?
  2. 048_输出一下short的所有值
  3. CoolQ/DingTalk 实现CI/CD消息推送到群
  4. java给你的初步印象_Java之初印象
  5. 亚马逊产品描述计算机语言编辑,亚马逊Listing产品描述编辑讲解
  6. Git笔记(27) 储藏与清理
  7. python执行变量次_当脚本再次执行时需要一个变量来保留它的值(Python)
  8. Ubuntu-10.04中设置和修改root密码
  9. 泛型指针,原生指针和智能指针
  10. python数据清洗 - Numpy库
  11. Git 提交大文件提示 fatal: The remote end hung up unexpectedly
  12. Android上的CPU和GPU是共享内存,为什么有的手机从GPU读取数据还是很慢?
  13. 文件的三种加载方式(全网讲解最全,最严谨)
  14. 各种数据类型的取值范围
  15. 实习收获之 获取json对象键值的几种方法
  16. java 热键_定义自己的热键
  17. 快速删除node_modules文件夹:rimraf node_modules
  18. 用了这么多年iPhone,你知道包装盒里为何会有两张贴纸?看完涨知识
  19. 录屏怎么录声音?注意一点轻松录制外部音源
  20. 聪明好学的王强用计算机设计了,五年级语文下册期中试卷-(1)(1).doc

热门文章

  1. 第69课:Spark SQL通过Hive数据源JOIN实战 每天晚上20:00YY频道现场授课频道68917580
  2. MayaBatch.py 解读
  3. 充电口 米兔积木机器人_米兔积木机器人居然可以这么玩?!
  4. Linux设置swap分区为128g,linux增加swap空间的方法小结
  5. 瑞芯微RK3568开发板深度评测
  6. 自定义控件 1 (入门)
  7. flutter 简单设置路由
  8. python random.sample()和random.choices()
  9. java程序员自我介绍
  10. 05-思维导图Xmind快速入门