简介:

  同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。

虚函数:

  在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数。

class Base
{
public:
virtual void print(void)
{
    //...
}
}; class Derived : public Base
{
public:
virtual void print(void)
{
    //...
}
};

PS:

  1、当类中声明虚函数时,编译器会在类中生成一个虚函数表。

  2、虚函数表是一个存储类成员函数指针的数据结构。

  3、虚函数表是由编译器自动生成与维护的。

  4、virtual成员函数会被编译器放入虚函数表中。

  5、当存在虚函数时,每个对象中都有一个指向虚函数表的vfptr指针。

  6、vfptr指针一般作为类对象的第一个成员 。

  7、使用VS开发人员命令提示可以查看内存布局和虚函数表。

cl /d1 reportSingleClassLayout类名 CPP文件名 

纯虚函数:

  纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。起到定义接口的作用。

class Base
{
public:
virtual void print(void) = ;
};

虚析构函数:

  通过基类指针析构所以派生类的资源。如果基类的析构函数不是虚函数,则delete一个指向派生类对象的基类指针只会释放基类申请的内存。

class Base
{
public:
virtual ~Base()
{
}
};

Demo:

#include <iostream>
using namespace std; class Base
{
public:
Base()
{
cout << "Base构造函数" << endl;
}
virtual ~Base()
{
cout << "Base析构函数" << endl;
}
virtual void print(void)
{
cout << "Base" << endl;
}
}; class Derived : public Base
{
public:
Derived()
{
cout << "Derived构造函数" << endl;
}
~Derived()
{
cout << "~Derived析构函数" << endl;
}
virtual void print(void)
{
cout << "Derived" << endl;
}
}; void show(Base *pb)
{
pb->print();
} int main()
{
Base *pb = new Base;
show(pb); //输出Base
delete pb; Base *pd = new Derived;
show(pd); //输出Derived
delete pd;
system("pause");
return ;
}

C++学习笔记6——类的多态的更多相关文章

  1. python学习笔记4_类和更抽象

    python学习笔记4_类和更抽象 一.对象 class 对象主要有三个特性,继承.封装.多态.python的核心. 1.多态.封装.继承 多态,就算不知道变量所引用的类型,还是可以操作对象,根据类型 ...

  2. Java学习笔记——File类之文件管理和读写操作、下载图片

    Java学习笔记——File类之文件管理和读写操作.下载图片 File类的总结: 1.文件和文件夹的创建 2.文件的读取 3.文件的写入 4.文件的复制(字符流.字节流.处理流) 5.以图片地址下载图 ...

  3. Java学习笔记之---类和对象

    Java学习笔记之---类和对象 (一)类 类是一个模板,它描述一类对象的行为和状态  例如:动物类是一个类,动物们都有属性:颜色,动物们都有行为:吃饭 public class Dog { Stri ...

  4. UML学习笔记:类图

    UML学习笔记:类图 有些问题,不去解决,就永远都是问题! 类图 类图(Class Diagrame)是描述类.接口以及它们之间关系的图,用来显示系统中各个类的静态结构. 类图包含2种元素:类.接口, ...

  5. swift学习笔记3——类、结构体、枚举

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  6. 学习笔记 Java类的封装、继承和多态 2014.7.10

    1.问题:toString()没搞懂? int a = 1; Integer aa = new Integer(a); //这是实现的过程 System.out.println("Hello ...

  7. 初探swift语言的学习笔记四(类对象,函数)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29606137 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...

  8. Java学习笔记-File类的基本方法

    要渐渐养成写博客的习惯-----> 前段时间看Mars的java中的I/O流没怎么懂,发现I/O流好难啊.今天重新看一遍其他教学,还有书籍,做些笔记,记录下每天的学习生活. File类的一些方法 ...

  9. Java 学习笔记(7)——接口与多态

    上一篇说了Java面向对象中的继承关系,在继承中说到:调用对象中的成员变量时,根据引用类型来决定调用谁,而调用成员方法时由于多态的存在,具体调用谁的方法需要根据new出来的对象决定,这篇主要描述的是J ...

随机推荐

  1. 滑雪 (搜索)(dp)(贪心)

    以每一点为起点找出所有路径,并求出以此点做为起点的最大路径 求出每个点的最大路径后再找出其中最大的值,输出最大值 #include <stdio.h>#include <string ...

  2. denyhost

    1. denyhost 简介及ssh安全 对外提供的服务器,每天都会被恶意扫描,试图暴力穷举密码,达到入侵的目的.从而控***务器,占用资源.网页挂马.垃圾广告.更会影响我们业务的正常使用和数据的安全 ...

  3. poj1042

    题目大意:去捕鱼 约翰去参加一个垂钓旅行,他有h小时可以使用在该地区有n (2 <= n <= 25) 个湖泊可以沿着一个单一的路到达,约翰从湖泊1开始,但是它可以在任何湖泊结束他如果想, ...

  4. Android程序的入口点和全局变量设置--application

    首先看看 application的官方文档 我之前一直以为Android程序的入口点就是带MAIN和LAUNCHER的Activity的onCreate方法,看来我是错了~  原来真正的入口点是 Ap ...

  5. maven profile实现多环境打包

    快速解决: 项目目录 1.pom文件中添加profile <profiles> <profile> <!-- 本地开发环境 --> <id>dev< ...

  6. Linux下生产者与消费者的线程实现

    代码见<现代操作系统> 第3版. 为了显示效果,添加了printf()函数来显示运行效果 #include<stdio.h> #include<pthread.h> ...

  7. ORACLE 11G EXP导出空表方法

    EXP在导出11G的库的时候,与过去10G,9I的版本有很大的差别. 就是没有数据的表是不会分配空间的. 从Oracle 11.2.0.1版本开始,Oracle又提供了一种新的空间分配方法: Crea ...

  8. configure JAAS for jboss 7.1 and mysql--reference

    Hello all, In this tutorial we are going to configure JAAS for jboss 7.1 and mysql for Form based au ...

  9. Android(java)学习笔记229:服务(service)之绑定服务调用服务里面的方法 (采用接口隐藏代码内部实现)

    1.接口 接口可以隐藏代码内部的细节,只暴露程序员想暴露的方法 2.利用上面的思想优化之前的案例:服务(service)之绑定服务调用服务里面的方法,如下: (1)这里MainActivity.jav ...

  10. Another app is currently holding the yum lock; waiting for it to exit... 怎么解决

    Another app is currently holding the yum lock; waiting for it to exit... 怎么解决 这个问题说明你的程序yum程序正在运行,必须 ...