C/C++基础--面向对象编程OOP
基类通常定义一个虚析构函数,通过基类指针析构派生类对象时不会出现未定义的行为。
如果一个类定义析构函数,编译器不会为这个类合成移动操作。
虚函数覆盖,可以显式地加override,可以让程序员的意图更加清晰,同时让编译器可以为我们返现一些错误。
派生类,先初始化基类的部分,然后再按照声明的顺序依次初始化派生类的成员。
不希望一个类被继承,将它定义为final
和内置指针一样,智能指针也支持派生类到基类的类型转换。该转换只对指针和引用有效。
同时受可访问性的限制,如D继承自B,如不是公有继承,用户代码不能使用该转换。D的成员和友元则永远可以执行转换。如是公有或保护继承,D的派生类的成员和友元也可以执行转换。
虚函数的形参和返回类型必须和基类一致。一个例外是,当虚函数返回类型是类本身的指针或引用时。
使用作用于运算符可以回避虚函数机制,主要用于派生类中调用它覆盖的基类的虚函数版本时。
派生类的成员或友元只能通过派生类对象来访问基类的受保护成员。而不能直接通过基类对象访问。
派生访问说明符对派生类的成员(友元)能否访问其直接基类的成员没有什么影响。主要目的是控制派生类用户(包括派生类的派生类)对于基类成员的访问权限。
通过using声明语句改变成员的可访问性,使得派生类的用户可以使用基类的私有成员。
class Derived:private Base
{
public:
using Base::size;
}
派生类的作用域在基类之内,解析的时候从内往外查找。一旦找到进行常规的类型检查,确认是否合法。如果合法,根据是否是虚函数将产生不同的代码。
派生类删除的拷贝控制与基类的关系
基类某函数是删除或不可访问,派生类对应成员也删除。
基类析构函数删除,则派生类合成的默认和拷贝构造是删除的。
基类移动是删除的,派生类移动也删除;基类析构删除,派生移动构造也删除。
派生类构造和赋值需要同时处理基类的成员,析构则只负责自己的资源。
D &D::operator=(const D &rhs)
{
Base::operator=(rhs);
//派生类的成员赋值
return *this;
}
派生类继承基类的构造函数
其实就是using声明语句显式地让编译器生成与构造基类形参列表完全相同的派生类构造函数。
using B:: B;
生成形式如下
D(parms):base(args){}
不能指定explicit或constexpr,基类是什么属性派生类也一样。默认参数不继承,生成多个构造函数。
派生类可以继承部分构造函数,自己定义部分。自己定义的部分将会替换继承来的相同类型的部分。
默认、拷贝和移动构造函数不会被继承。
C/C++基础--面向对象编程OOP的更多相关文章
- python基础——面向对象编程
python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...
- JavaScript--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)
一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...
- JS--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)
一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...
- 大数据技术之_16_Scala学习_04_函数式编程-基础+面向对象编程-基础
第五章 函数式编程-基础5.1 函数式编程内容说明5.1.1 函数式编程内容5.1.2 函数式编程授课顺序5.2 函数式编程介绍5.2.1 几个概念的说明5.2.2 方法.函数.函数式编程和面向对象编 ...
- [JAVA] 面向对象编程OOP Note
面向对象编程OOP Note OOP五个基本特性1. 万物皆对象.2. 程序是对象的集合,它们通过发送消息来告知彼此所要做的.3. 每个对象都有自己的由其他对象所构成的存储.4. 每个对象都拥有其类型 ...
- 学习面向对象编程OOP 第一天
面向对象编程 Object Oriented Programming 一.什么是面向对象编程OOP 1.计算机编程架构; 2.计算机程序是由一个能够起到子程序作用的单元或者对象组合而成.也就是说由多个 ...
- JS--我发现,原来你是这样的JS:面向对象编程OOP[3]--(JS继承)
一.面向对象编程(继承) 这篇博客是面向对象编程的第三篇,JS继承.继承顾名思义,就是获取父辈的各种"财产"(属性和方法). 怎么实现继承? 我们的JavaScript比较特别了, ...
- 面向过程编程(OPP) 和面向对象编程(OOP)的关系
面向过程编程(OPP) 和面向对象编程(OOP)的关系 原文链接:http://blog.csdn.net/phphot/article/details/3985480 关于面向过程的编程(OPP)和 ...
- S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则
注:以下图片均来自<如何向妻子解释OOD>译文链接:http://www.cnblogs.com/niyw/archive/2011/01/25/1940603.html < ...
随机推荐
- J - FatMouse's Speed
p的思路不一定要到最后去找到ans:也可以设置成在中间找到ans:比如J - FatMouse's Speed 这个题,如果要是让dp[n]成为最终答案的话,即到了i,最差的情况也是dp[i-1],就 ...
- 极大极小搜索思想+(α/β)减枝 【转自-----https://blog.csdn.net/hzk_cpp/article/details/79275772】
极大极小搜索,即minimax搜索算法,专门用来做博弈论的问题的暴力. 多被称为对抗搜索算法. 这个搜索算法的基本思想就是分两层,一层是先手,记为a,还有一层是后手,记为b. 这个搜索是认为这a与b的 ...
- 解决Myeclipse ctrl+h带来的困扰
解决Myeclipse ctrl+h带来的困扰 myeclipse的ctrl+h搜索功能给我们来查找文件定位类的方便,但同时也给我们带来两个困扰:一是搜出来的结果往往带着svn文件,一大推svn隐藏的 ...
- Redis(一)入门
最近,学习了一下,Redis 这个Nosql数据库,从安装到基本语法,作为入门.下面,整理一下基本知识. 参考的地址如下: http://www.runoob.com/redis/redis-java ...
- JS push对象
var zoom = page.maps.maps._map.getZoom(), centerPoint = page.maps.maps._map.getCenter(); data = $(&q ...
- Python面试 【315+道题】
Python面试 [315+道题] 第一部分 Python基础篇(80题) 为什么学习Python? 因为看到python的发展趋势,觉得需要与时俱进,第一点,python开发速度极快,能快速完成一个 ...
- 多线程线性 lock
有时我们lock一段代码或许要根据某个变量的值,值相同则不允许有两个或以上的方法并行运行,我在工作中就遇到了,有100个值,相同的参数值不能并行运行. 还有就是一个被lock的方法递归调用会不会死锁, ...
- Centos7禁止或者允许开机启动服务
[root@bogon rsyslog.d]# systemctl is-enabled httpd disabled [root@bogon rsyslog.d]# systemctl status ...
- linux之nagios安装教程
我的系统环境是centos7,其它系统应该也差不多,只是有几条命令可能需要换种写法 下面是我用到的命令 363 yum install -y gcc gcc-c++ httpd php php-gd ...
- Android资源收集
1 android studio最新版本下载地址:https://developer.android.google.cn/studio/preview/?utm_source=android-stud ...