一、C++多态

C++的多态包括静态多态和动态多态。静态多态包括函数重载和泛型编程,动态多态包括虚函数。静态多态是指在编译期间就可以确定,动态多态是指在程序运行时才能确定。

二、虚函数

1、虚函数为类的非静态成员函数,访问权限一般为public。函数声明时,在返回值前加virtual关键字,函数定义时不需要加virtual。父类定义的虚函数,子类在继承时,可以对虚函数重新定义,当然子类的函数应该与父类虚函数一样,只是函数实现不一样。我们用父类的指针指向子类的实例,然后通过父类的指针可以调用实际子类的成员函数。

2、构造函数不能为虚函数

3、当基类中有虚函数的时候,一般基类的析构函数也要定义为虚析构函数。如果不定义虚析构函数,当删除一个指向派生类对象的指针时,会调用基类的析构函数,派生类的析构函数未被调用,造成内存泄漏。定义虚析构函数后,最底层的派生类的析构函数最先被调用,然后各个基类的析构函数被调用。

三、纯虚函数

纯虚函数为虚函数在声明时,函数末尾加=0,纯虚函数没有函数定义,它的子类需要继承所有基类的纯虚函数并且给出定义。纯虚函数的作用就是为派生类提供一个一致的接口。

四、抽象类

抽象类就是指含有纯虚函数的类,该类不能创建对象,但是可以声明指针和引用。

五、虚基类

1、如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员。在引用这些同名的成员时,必须在派生类对象名后增加直接基类名,以避免二义性。

示例:

class A
{

public:

int m_nNum;

};
class B :public A
{…};
class C :public A
{…};

class D :public B,public C 
{
};

D d1;

d1.A::m_nNum;

2、C++提供虚基类,使得在继承间接共同基类时只保留一份成员。

示例:

class A
{

public:

int m_nNum;

};
class B :virtual public A
{…};
class C :virtual public A
{…};

class D :public B,public C 
{
};

D d1;

d1.m_nNum;

3、在最后的派生类中不仅要负责对直接基类进行初始化,还要负责对虚基类初始化。C++编译系统只执行最后的派生类对虚基类的构造函数的调用,而忽略虚基类的其他派生类(B和C)对虚基类的构造函数的调用,保证了虚基类成员不会被多次初始化。

例如:

class D :public B,public C 
{
   D(int n):A(n),B(n),C(n){ }
};

构造的顺序为先构造最上层基类,然后父类谁先继承谁先构造,析构函数的顺序和构造函数顺序相反。

C++多态、虚函数、纯虚函数、抽象类、虚基类的更多相关文章

  1. 虚函数的使用 以及虚函数与重载的关系, 空虚函数的作用,纯虚函数->抽象类,基类虚析构函数使释放对象更彻底

    为了访问公有派生类的特定成员,可以通过讲基类指针显示转换为派生类指针. 也可以将基类的非静态成员函数定义为虚函数(在函数前加上virtual) #include<iostream> usi ...

  2. C++纯虚函数、虚函数、实函数、抽象类,重载、重写、重定义

    首先,面向对象程序设计(object-oriented programming)的核心思想是数据抽象.继承.动态绑定.通过数据抽象,可以使类的接口与实现分离,使用继承,可以更容易地定义与其他类相似但不 ...

  3. 虚函数&纯虚函数&抽象类&虚继承

    C++ 虚函数&纯虚函数&抽象类&接口&虚基类   1. 多态 在面向对象语言中,接口的多种不同实现方式即为多态.多态是指,用父类的指针指向子类的实例(对象),然后通过 ...

  4. 【转】C++ 虚函数&纯虚函数&抽象类&接口&虚基类

    1. 动态多态 在面向对象语言中,接口的多种不同实现方式即为多态.多态是指,用父类的指针指向子类的实例(对象),然后通过父类的指针调用实际子类的成员函数. 多态性就是允许将子类类型的指针赋值给父类类型 ...

  5. C++ 虚函数&纯虚函数&抽象类&接口&虚基类(转)

    http://www.cnblogs.com/fly1988happy/archive/2012/09/25/2701237.html 1. 多态 在面向对象语言中,接口的多种不同实现方式即为多态.多 ...

  6. C++基础知识 基类指针、虚函数、多态性、纯虚函数、虚析构

    一.基类指针.派生类指针 父类指针可以new一个子类对象 二.虚函数 有没有一个解决方法,使我们只定义一个对象指针,就可以调用父类,以及各个子类的同名函数? 有解决方案,这个对象指针必须是一个父类类型 ...

  7. c++ 多态,虚函数、重载函数、模版函数

    c++三大特性:封装.继承.多态.封装使代码模块化,继承扩展已存在的代码,多态的目的是为了接口重用 虚函数实现:虚函数表:指针放到虚函数表 多态:同名函数对应到不同的实现 构造父类指针指向子类的对象 ...

  8. 4.6 C++抽象基类和纯虚成员函数

    参考:http://www.weixueyuan.net/view/6376.html 总结: 在C++中,可以通过抽象基类来实现公共接口 纯虚成员函数没有函数体,只有函数声明,在纯虚函数声明结尾加上 ...

  9. 【转载】 C++多继承中重写不同基类中相同原型的虚函数

    本篇随笔为转载,原文地址:C++多继承中重写不同基类中相同原型的虚函数. 在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA { public: ...

  10. OOP2(虚函数/抽象基类/访问控制与继承)

    通常情况下,如果我们不适用某个函数,则无需为该函数提供定义.但我们必须为每个虚函数都提供定义而不管它是否被用到了,这因为连编译器也无法确定到底会适用哪个虚函数 对虚函数的调用可能在运行时才被解析: 当 ...

随机推荐

  1. keras01 - hello world ~ 搭建第一个神经网络

    import numpy as np from keras.datasets import mnist from keras.models import Sequential, Model from ...

  2. vim命令:编辑模式和命令模式

      vim:编辑模式 从一般模式进入编辑模式,只需你按一个键即可(i,I,a,A,o,O,r,R).当进入编辑模式时,会在屏幕的最下一行出现“INSERT或REPLACE”的字样.从编辑模式回到一般模 ...

  3. MVC和MVVM

    MVC和MVVM的qu'bie 1. Mvvm定义MVVM是Model-View-ViewModel的简写.即模型-视图-视图模型.[模型]指的是后端传递的数据.[视图]指的是所看到的页面.[视图模型 ...

  4. 对于996.ICU这个热门话题,一个在校学生的思考

    最近GitHub上的项目996.ICU一经发布就得巨大的回响,看了这么说法和评论,作为一个准程序猿也有自己的一些想法. 1 其实看得出来,很大一部分人认为的是付出与回报不对等.简单说就是工资对于工作量 ...

  5. position: fixed; ios 无法滑动解决

    添加以下代码搞定 -webkit-overflow-scrolling: touch; overflow-y: scroll;

  6. 多线程threading

    threading用于提供线程相关的操作,线程是应用程序中工作的最小单元.python当前版本的多线程库没有实现优先级.线程组,线程也不能被停止.暂停.恢复.中断. 1.     threading模 ...

  7. APP 后台学习笔记

    1.APP后台功能: 远程存储数据.消息中转 2.架构是业务驱动,可能随着开发进程而变化,没有最完美架构 3.架构不要满足追求技术新奇酷炫,而是结合具体业务使用合适的技术,否则会给运维带来很多不必要的 ...

  8. 【Mac上的PotPlayer视频播放器】Movist Pro for Mac 2.1.2

    [简介] Movist 是Mac上最好用的视频播放器之一,功能齐全,类似Windows上的PotPlayer,今天和大家分享最新的 2.1.2 中文版本,Movist 支持几乎所有常见的视频格式,包括 ...

  9. python验证卡普耶卡(D.R.Kaprekar)6174猜想

    1955年,卡普耶卡(D.R.Kaprekar)对4位数字进行了研究,发现一个规律: 对任意各位数字不相同的4位数,使用各位数字能组成的最大数减去能组成的最小数,对得到的差重复这个操作,最终会得到61 ...

  10. Java基础--面向对象编程1(类与对象)

    1.类(class)的定义 类是对一组具有相同特征和行为的对象的抽象描述. 在程序中,引入类的概念,就是为了快速生成更多的具有相同特性和行为的事物. 2.对象(object)的定义 对象是类的具体实现 ...