基类通常定义一个虚析构函数,通过基类指针析构派生类对象时不会出现未定义的行为。
如果一个类定义析构函数,编译器不会为这个类合成移动操作。
虚函数覆盖,可以显式地加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的更多相关文章

  1. python基础——面向对象编程

    python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...

  2. JavaScript--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)

    一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...

  3. JS--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)

    一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...

  4. 大数据技术之_16_Scala学习_04_函数式编程-基础+面向对象编程-基础

    第五章 函数式编程-基础5.1 函数式编程内容说明5.1.1 函数式编程内容5.1.2 函数式编程授课顺序5.2 函数式编程介绍5.2.1 几个概念的说明5.2.2 方法.函数.函数式编程和面向对象编 ...

  5. [JAVA] 面向对象编程OOP Note

    面向对象编程OOP Note OOP五个基本特性1. 万物皆对象.2. 程序是对象的集合,它们通过发送消息来告知彼此所要做的.3. 每个对象都有自己的由其他对象所构成的存储.4. 每个对象都拥有其类型 ...

  6. 学习面向对象编程OOP 第一天

    面向对象编程 Object Oriented Programming 一.什么是面向对象编程OOP 1.计算机编程架构; 2.计算机程序是由一个能够起到子程序作用的单元或者对象组合而成.也就是说由多个 ...

  7. JS--我发现,原来你是这样的JS:面向对象编程OOP[3]--(JS继承)

    一.面向对象编程(继承) 这篇博客是面向对象编程的第三篇,JS继承.继承顾名思义,就是获取父辈的各种"财产"(属性和方法). 怎么实现继承? 我们的JavaScript比较特别了, ...

  8. 面向过程编程(OPP) 和面向对象编程(OOP)的关系

    面向过程编程(OPP) 和面向对象编程(OOP)的关系 原文链接:http://blog.csdn.net/phphot/article/details/3985480 关于面向过程的编程(OPP)和 ...

  9. S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则

    注:以下图片均来自<如何向妻子解释OOD>译文链接:http://www.cnblogs.com/niyw/archive/2011/01/25/1940603.html      < ...

随机推荐

  1. Skflow mac安装 for tensorflow-0.8.0

    参考: # Mac OS X, CPU only: $ pip install --ignore-installed --upgrade https://storage.googleapis.com/ ...

  2. select标签(下拉菜单和列表)

    下拉菜单和列表标签: <select> <option value="..." >选项</option> <option value=&q ...

  3. HDU - 4454: Stealing a Cake (圆上三分)

    pro:给定一个蛋糕,一个矩阵房子,一只蚂蚁.最开始三者两两相离,问蚂蚁触摸到蛋糕后再触摸矩阵的最短距离.结果保留两位小数,坐标的绝对值<1e4: sol:由于坐标不大,而且精度要求不高,不难想 ...

  4. matlab学习(2) sort、sortrows

    1.sort函数 对于向量,sort(X)把向量的元素按照从小到大排序: 对于矩阵,sort(X)按照从小到大顺序对矩阵每一列进行排序:sort(X,2)按照行排序 对于字符串的元胞数组,sort(X ...

  5. linux下如何执行.sh文件 【转】

    Linux下如何运行.sh文件 是UNIX/LINUX 操作系统的脚本文件,SHELL文件. 本文转载自 http://whitepoplar.javaeye.com/blog/431967 Linu ...

  6. Python 模块管理1

    Python 模块管理   导入新的模块 创建一个 calculate.py 文件 print('ok') def add(x,y): return x + y def sub(x,y): retur ...

  7. 尚硅谷【SpringBoot】入门

    https://www.bilibili.com/video/av20965295/?p=2 缺点: 基于springframe的封装    对framework api需要熟悉 2微服务 2014 ...

  8. 迭代器和增强型for循环

    ★迭代器: Java集合框架的集合类,我们有时候称之为容器.容器的种类有很多种,比如ArrayList.LinkedList.HashSet...,每种容器都有自己的特点,ArrayList底层维护的 ...

  9. Linux期末复习题

    版权声明: https://blog.csdn.net/u014483914/article/details/36622451 1.More和less命令的差别         More命令通经常使用 ...

  10. KiCad 的 Digikey 元件库

    KiCad 的 Digikey 元件库 KiCad 最初由法国人Jean-Pierre Charras于1992年推出,目前由 CERN(欧洲核子研究组织)接手开发. 而且现在有很多大公司的加入,比如 ...