在介绍多态之前,先回忆:赋值兼容原则、虚基类、二义性、派生类如何给基类赋值等知识。

在赋值兼容原则中:父类对象的指针赋给基类的指针或者父类的对象赋给基类的引用,可以通过强转基类的指针或者引用变为父类的对象。

1 如果不强转访问函数或者数据时只能访问基类本身的,但是此时基类本身数据或者函数中的值应该是父类给赋予的。总之一句话:在没有虚函数时指针或者引用的向上转型,编译看左边,访问也看左边——这叫重载函数之间的关系。(书中P201的例子)

2 当基类中的函数是虚函数时,只要声明了基类指针,就可以用它指向不同的派生类对象产生不同的函数调用,可见运行时多态应该使用虚函数,并通过基类指针或者引用调用派生类对象的虚函数。注意:虚函数的声明只能出现在类声明时的函数原型中,派生类可以不显示的声明为虚函数,系统自动片时虚函数之间的关系还是重载函数之间的关系,虚函数不能是友函数或者静态函数,必须是成员函数。总之一句话:在有虚函数时指针或者引用的向上转型,编译看左边,访问看右边——这叫虚函数之间的关系。

3 函数纯虚函数的类成为抽象类。设计抽象类的目的就是多态的使用它的成员函数,由此为整个类族规定统一的接口形式。抽象类不能实例化。必须通过继承得到派生类,然后在派生类中定义函数的具体实现代码,再获得派生类的对象。

virtual  类型 函数名(参数列表)=;

纯虚函数需要在派生类中实现,否则这个派生类依旧是抽象类。

4 虚析构函数

在使用虚函数过程中,如果处理不当析构函数往往不执行或者部分不执行(编程已经测试,情况比较多,这里就不一一列举,总之不像没使用虚函数时一样,没有使用虚函数时,析构函数从基类到派生类全部执行,使用了虚函数往往就不会了),此时如果存在动态内存分配在类中,并且清理工作是在析构函数中,只要将基类的析构函数声明时虚析构函数即可,此时派生类中以及子类中的析构函数也是虚析构函数。

C++ (P199—P211)多态 虚函数 抽象类的更多相关文章

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

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

  2. 多态&虚函数

     (1).对象类型:           a.静态类型:对象声明时的类型,编译的时候确定           b.动态类型:对象的类型是运行时才能确定的 class A {}; class B:pub ...

  3. 多态性&& 虚函数 && 抽象类

    http://www.cnblogs.com/CaiNiaoZJ/archive/2011/08/11/2134673.html 多态性 指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动 ...

  4. C++继承-重载-多态-虚函数

    C++ 继承 基类 & 派生类 一个类可以派生自多个类,这意味着,它可以从多个基类继承数据和函数.定义一个派生类,我们使用一个类派生列表来指定基类.类派生列表以一个或多个基类命名,形式如下: ...

  5. c++学习之多态(虚函数和纯虚函数)

    c++是面向对象语言,面向对象有个重要特点,就是继承和多态.继承之前学过了,就是一种重用类的设计方式.原有的类叫父类,或者基类,继承父类的类叫子类.在设计模式中,我们总是要避免继承,推荐用组合.因为继 ...

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

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

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

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

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

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

  9. 看懂下面C++代码才说你理解了C++多态虚函数!

    #include <iostream> using namespace std ; class Father { private :  virtual void Say()  //只有添加 ...

随机推荐

  1. 【opencv】图像细化

    [原文:http://blog.csdn.net/qianchenglenger/article/details/19332011] 在我们进行图像处理的时候,有可能需要对图像进行细化,提取出图像的骨 ...

  2. LWIP互联网资料汇总

    本文主要搜集了下互联网上关于LWIP的资料和教程 欢迎补充 第一部分:移植 LWIP在UCOS上移植 LWIP 在STM32上移植   http://www.docin.com/p-459242028 ...

  3. HW6.22

    import java.util.Arrays; public class Solution { public static void main(String[] args) { int[][] ch ...

  4. leetcode@ [124] Binary Tree Maximum Path Sum (DFS)

    https://leetcode.com/problems/binary-tree-maximum-path-sum/ Given a binary tree, find the maximum pa ...

  5. SPOJ-7001 VLATTICE 莫比乌斯反演定理

    题目链接:http://www.spoj.com/problems/VLATTICE/ 题意:求gcd(x,y,z)=1,1<=x,y,z<=n,的个数. 开始做的时候枚举gcd(x,y) ...

  6. Java网络编程(UDP协议-聊天程序)

    接收端: package WebProgramingDemo; import java.net.DatagramPacket; import java.net.DatagramSocket; publ ...

  7. A Tour of Go Exercise: Errors

    Copy your Sqrt function from the earlier exercises and modify it to return an error value. Sqrt shou ...

  8. hdoj 2122 Ice_cream’s world III

    并查集+最小生成树 Ice_cream’s world III Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  9. MongoDB让人恶心的配置

    dbpath.logpath必须指定到硬盘的根目录: dbpath=D:\data\dblogpath=D:\data\log\Mongodb.log 不然启动时会报没有设置dbpath的错误

  10. 使用CSS3和jQuery可伸缩的搜索条

    使用CSS3和jQuery可伸缩的搜索条 helloweba.com 作者:月光光 时间:2013-12-09 21:23 标签: CSS3 jquery 搜索条在我们网站是必不可少的,尤其是在有限的 ...