内容:

(1)子类中的拷贝构造和拷贝赋值
(2)多继承和虚继承
(3)多态的初识
(4)虚析构的特性和使用
(5)多态的底层实现
(6)纯虚函数、抽象类的概念

1.子类中的拷贝构造和拷贝赋值
子类中的拷贝构造和拷贝赋值可能也需要显式的指定父类子对象的拷贝构造和拷贝赋值的方式

2.多继承和虚继承
2.1 格式:
class 子类名 : 继承方式 父类名1,继承方式 父类名2,...
{
//子类中的属性和行为
};

如:
员工类
/ \
销售员工类 管理者类
\ /
销售管理类

叫做:钻石继承

2.2 虚继承要点
(1)在对公共基类的继承方式之前加virtual关键字修饰
(2)可能需要在最终子类中显式指定公共基类的构造方式
(3)目标:公共基类子对象在最终子类中只有一份,以避免从不同继承路径访问公共基类子对象时发生数据不一致的现象

注意:
在多继承中,如果多个父类都有函数名相同,参数表不同的函数,继承到子类中不会构成重载,如果子类中存在同名的标示符,则产生隐藏(02diamond.cpp文件)

练习:
写一个圆类(Circle),属性有:圆心坐标和半径;再写一个桌子类(Table),属性有:高度;两个类共同派生一个圆桌类(RoundTable),属性:颜色
要求:定义一个圆桌类的对象,打印出圆桌的桌面面积,体积以及颜色
圆的面积:PI*r*r;
圆的体积公式:底面积 * 高
(vi 03circle.cpp)

3.多态的初识
3.1 多态的特性
(1)通过指向子类对象的 基类指针/引用 只能调用基类中的成员函数
(2)通过指向子类对象的 基类指针/引用 调用虚函数,实际上调用的是子类中的版本
(3)虚函数和虚函数覆盖
虚函数:使用virtual关键字修饰的函数
虚函数覆盖:在子类中定义一个与基类中具有相同的函数原型的函数,即构成虚函数覆盖,该虚函数的覆盖版本也是虚函数(无论是否使用virtual修饰)
(04dynamic.cpp文件)

笔试题:
class B : public A{};
基类中:virtual A* foo(void){...}
子类中:virtual B* foo(void){...}
=> 产生虚函数覆盖

4.虚析构
使用virtual关键字修饰的析构函数

(1)虚析构函数实际上就是为了保证delete一个指向子类对象的基类指针时,实际上被调用的是子类中的析构函数,而子类中的析构函数会自动调用基类中的析构函数
(2)一般而言,如果一个类中有虚函数,那么该类就应该提供一个虚析构函数
(05destructor.cpp文件)

5.多态的底层实现
5.1 实现流程
如:
class A{...};
class B : public A{...};
A* pa = new B;
pa->foo();
当编译器编译上句代码时,它并不知道pa的所真正指向的真实对象(只有在运行时才会知道),编译器所能做的就是使用一段代码去替换上面的函数调用语句,这段代码依次执行下面的操作:
(1)首先弄清指针pa所指向的对象的真实身份
(2)然后通过这个对象的虚函数表指针去访问对应的虚函数表,并找到与foo函数标示符所对应的虚函数入口地址
(3)根据入口地址调用该函数

5.2 多态必要条件
(1)虚函数
(2)通过指针/引用 去调用

笔试题:
(1)
class A
{
public:
void foo(void)
{
// this = &b;
// this->bar();
bar();//调用B类中的bar函数
}
virtual void bar(void){...}
};

class B : public A
{
public:
//虚函数覆盖
void bar(void){...}
};

int main(void)
{
B b;
b.foo();
return 0;
}

(2)
构造函数、析构函数以及静态成员函数中,哪些函数可以是虚函数?
析构可以是虚函数
构造函数和静态成员函数不可以是虚函数

C++_基础_继承、多态的更多相关文章

  1. Python设计模式 - 基础 - 封装 & 继承 & 多态

    面向对象的核心是对象,世间万物都可以看作对象,任何一个对象都可以通过一系列属性和行为来描述,可以包含任意数量和类型的数据或操作.类是用来描述具有相同属性和方法的所有对象的集合.类通常是抽象化的概念,而 ...

  2. 07JAVA基础面向对象-继承/多态

    一.继承 1.概念 子类的共性 重用现有类并在此基础上进行扩展 public class 子类 extends 父类{} 2.继承中的成员访问 成员变量 成员方法 局部->本类中成员变量-> ...

  3. C# 面向对象基础&封装&继承&多态&加深一下冒泡排序写法

    (一)面向对象是什么? 面向对象是一种编程思想 (二)为什么要用面向对象? 1.结构清晰 2.易于维护 3.方便扩展 (三)new一个对象是什么过程? 实例化构造函数创建对象的过程就是将类实例化的过程 ...

  4. <python基础>封装,继承,多态,重写,重载

    什么是封装? 所谓的面向对象就是将我们的程序模块化,对象化,把具体事物的特性属性和通过这些属性来实现一些动作的具体方法放到一个类里面,这就是封装.封装是我们所说的面相对象编程的特征之一.除此之外还有继 ...

  5. C++_基础_运算符重载2

    内容: (1)只能用成员形式重载的运算符 (2)new/delete操作符的重载 (3)封装和继承的初识 (4)继承的特性 (5)子类及其函数的特性 (6)多重继承和虚继承 1.只能用成员形式重载的运 ...

  6. C++_基础_类和对象

    内容: (1)引用 (2)类型转换 (3)C++社区给C程序员的建议 (4)面向对象编程的概念 (5)类和对象 (6)构造函数 (7)初始化列表及其必要性 1.引用1.1 指针和引用的使用说明(1)指 ...

  7. java工程师_基础_阶段一_HTML笔记篇

    一.了解HTML语言 html:超文本标记语言. 二.HTML整体结构<html> <head> </head> <body> </body> ...

  8. C++_基础_运算符重载

    内容: (1)输入输出运算符重载 (2)友元类和友元函数 (3)双目运算符重载 (4)单目运算符重载 (5)不能被重载的运算符 (6)只能定义为成员形式的运算符 1.输入输出运算符重载如: int n ...

  9. C++_基础_类和对象3

    内容: (1)析构函数 (2)拷贝构造和拷贝赋值 (3)静态成员 (4)成员指针 (5)输入输出运算符重载 1.析构函数 当一个对象被创建时,自动调用构造函数进行初始化 当一个对象被销毁时,自动调用析 ...

随机推荐

  1. wx.BookCtrlBase

    wx.BookCtrlBase A book control is a convenient way of displaying multiple pages of information, disp ...

  2. poj2503

    有关字符串的hash,用黑书上推荐的传说中的ELFhash函数 输入的话,用sscanf处理比較简洁 #include<iostream> #include<cstring> ...

  3. 第一章ASP.NET SignalR简介

    第一章ASP.NET SignalR简介 1.1概述: ASP.NET SignalR是微软新开发的类库,为的是帮助ASP.NET开发人员很方便地开发实时网络功能. SignalR允许服务器端和客户端 ...

  4. VS中C++对象的内存布局

    本文主要简述一下在Visual Studio中C++对象的内存布局,这里没有什么测试代码,只是以图文的形式来描述一下内存分布,关于测试的代码以及C++对象模型的其他内容大家可以参考一下陈皓先生的几篇博 ...

  5. JavaWeb核心编程之(三.6)HttpServlet

    之前都是集成的Servlet真的太过于繁琐了, Servlet接口提供了一个实现类 为HttpServlet  只要实现doGet 和doPost方法就可以了 仍然以一个表单为例 新建一个web工程 ...

  6. Swift 函数和类

    函数: func sayHello(personName:String,z:Int)->{ return "hello"+personName+z } print(sayHe ...

  7. Linux网络管理——ISO/OSI七层模型

    1. 网络基础 1. 网络基础 1.1 iso/osi七层模型 事前声明: ISO:国际标准化组织 OSI:开放系统互联模型 IOS:苹果操作系统 但是在计算机网络当中,IOS是互联网操作系统,是思科 ...

  8. HTML前端技术(JS的使用,包括数组和字符串)

    <script type="text/javascript"> /* JS 数组的操作 //concat 连接两个或更多的数组,并返回结果. var arr1 = ne ...

  9. Nginx修改配置实现图片防盗链

    一般情况下,防盗链是针对软件下载和图片的,由于一般的站点不提供资源下载,所以本文主要是针对图片的防盗链 1.如果对全站图片做防盗链,至少需要一个另外的域名存放指向图片.因为如果对全站图片做了防盗链,包 ...

  10. php程序员的弱点

    今天在在知乎上看到一个问题,题目是<看了laravel的php框架怎么感觉很不靠谱?>,我最近也在想学习一下laravel,laravel听说是受到很大ruby on rails的影响. ...