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 < ...
随机推荐
- Nginx反向代理与Backend直接配置长连接
使用了Nginx的反向代理配置如下: upstream test{ keepalive 1; server 192.168.1.63:4000; } server { listen 4000; ser ...
- HDU 1754:I Hate It(线段树模板)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU 1260:Tickets(DP)
Tickets Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- BFS广度优先搜索 poj1915
Knight Moves Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 25909 Accepted: 12244 Descri ...
- 神坑,使用gcc对opencv重编译
工具 cmake-3.9.1 opencv-3.3.0 gcc-6.3.0 前几天为了装eclipse的CDT,把minggw里的make改了,今天突然想学opencv,可是只找到了vc版本,千辛万 ...
- 企业库实现AOP的几种方法
1.创建新对象时,分继承基类和继承接口 TargetClass theTarget = PolicyInjection.Create<TargetClass>(parameter1, pa ...
- navicat连接oracle方法及其安装包
Navicat破解版下载(安装好之后,点击执行最后一个破解文件即可) 链接: https://pan.baidu.com/s/1pMpVwfT 密码: vrt6 连接oracle还需要下载以下文件,o ...
- Nio使用Selector客户端与服务器的通信
使用NIO的一个最大优势就是客户端于服务器自己的不再是阻塞式的,也就意味着服务器无需通过为每个客户端的链接而开启一个线程.而是通过一个叫Selector的轮循器来不断的检测那个Channel有消息处理 ...
- Ts基础
//typeof 用来判断变量类型 var s: string = 'egret'; var isString: boolean = typeof s === 'string'; console.lo ...
- mysql数据库优化方法大数据量查询轻松解决
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...