基类通常定义一个虚析构函数,通过基类指针析构派生类对象时不会出现未定义的行为。
如果一个类定义析构函数,编译器不会为这个类合成移动操作。
虚函数覆盖,可以显式地加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. 用纯JS实现,点击一个列表时,输出对应的索引(不能用JQuery哦)

    你运行一下代码会发现,无论你点击哪个列表,控制台都是输出10.这是因为var声明的变量是函数作用域的,而不是块级作用域的.也就是说,for循环10次,每次都是改变同一个i,所以它的值会从0一直加到10 ...

  2. soft-nms

    https://blog.csdn.net/app_12062011/article/details/77963494 ----> NMS-非极大值抑制进行后处理. 通常的做法是将检测框按得分排 ...

  3. HTTP/2及HTTP/3特性

    HTTP/2及HTTP/3特性 摘要: 学习 HTTP/2 与 HTTP/3. 前言 HTTP/2 相比于 HTTP/1,可以说是大幅度提高了网页的性能,只需要升级到该协议就可以减少很多之前需要做的性 ...

  4. java-代码块-局部代码块、构造代码块、静态代码块

    1.代码块概述: 在Java中,使用{ }括起来的代码被称为代码块. 2.代码块分类: 根据其位置和声明的不同,可以分为局部代码块,构造代码块.静态代码块和同步代码块(多线程). 3.常见代码块的应用 ...

  5. Javascript中的 “&” 和 “|” 详解

    转自:https://www.jb51.net/article/104394.htm 一.前言: 在文章开始之前,先出几个题目给大家看看: var num1 = 1 & 0; console. ...

  6. 不输入密码执行sudo 命令

    命令行执行的crontab 命令,但是需要包含sudo 才可以执行的命令,怎么办呢?见下: leo@leo-Ubuntu:/etc$ visudovisudo: /etc/sudoers: 权限不够v ...

  7. Js 分别取一个数的百位,十位,个位

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  8. MVVM在WPF中应用(1)

    在软件行业浸润了这么多年,第一次在MES的工厂里从事软件开发. 在这里的感觉就是安静.宽松,比在那些专门以软件为主的企业中轻松自在.在这里的第一个项目是关于数据的导入和导出,还有数据的比较这些功能. ...

  9. LG2634 [国家集训队]聪聪可可

    题意 题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问题,一般情况下石头剪刀布就好了,可是 ...

  10. IntelliJ IDEA备忘

    IntelliJ IDEA生成get/set方法的快捷键 IntelliJ IDEA生成get/set有2种方式,alt+enter.alt+insert.下面分别介绍这2种方式快速生成get与set ...