C++学习笔记6——类的多态
简介:
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
虚函数:
在某基类中声明为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——类的多态的更多相关文章
- python学习笔记4_类和更抽象
python学习笔记4_类和更抽象 一.对象 class 对象主要有三个特性,继承.封装.多态.python的核心. 1.多态.封装.继承 多态,就算不知道变量所引用的类型,还是可以操作对象,根据类型 ...
- Java学习笔记——File类之文件管理和读写操作、下载图片
Java学习笔记——File类之文件管理和读写操作.下载图片 File类的总结: 1.文件和文件夹的创建 2.文件的读取 3.文件的写入 4.文件的复制(字符流.字节流.处理流) 5.以图片地址下载图 ...
- Java学习笔记之---类和对象
Java学习笔记之---类和对象 (一)类 类是一个模板,它描述一类对象的行为和状态 例如:动物类是一个类,动物们都有属性:颜色,动物们都有行为:吃饭 public class Dog { Stri ...
- UML学习笔记:类图
UML学习笔记:类图 有些问题,不去解决,就永远都是问题! 类图 类图(Class Diagrame)是描述类.接口以及它们之间关系的图,用来显示系统中各个类的静态结构. 类图包含2种元素:类.接口, ...
- swift学习笔记3——类、结构体、枚举
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- 学习笔记 Java类的封装、继承和多态 2014.7.10
1.问题:toString()没搞懂? int a = 1; Integer aa = new Integer(a); //这是实现的过程 System.out.println("Hello ...
- 初探swift语言的学习笔记四(类对象,函数)
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29606137 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...
- Java学习笔记-File类的基本方法
要渐渐养成写博客的习惯-----> 前段时间看Mars的java中的I/O流没怎么懂,发现I/O流好难啊.今天重新看一遍其他教学,还有书籍,做些笔记,记录下每天的学习生活. File类的一些方法 ...
- Java 学习笔记(7)——接口与多态
上一篇说了Java面向对象中的继承关系,在继承中说到:调用对象中的成员变量时,根据引用类型来决定调用谁,而调用成员方法时由于多态的存在,具体调用谁的方法需要根据new出来的对象决定,这篇主要描述的是J ...
随机推荐
- Substrings - HDU 1238(最大共同子串)
题目大意:给你N个串,求出来他们的最大公共子串的长度(子串反过来也算他们的子串). 分析:很久以前就做过这道题,当时是用的strstr做的,不过相同的都是枚举了子串......还是很暴力,希望下次 ...
- hdu 3698 Let the light guide us(线段树优化&简单DP)
Let the light guide us Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 62768/32768 K (Java/O ...
- 一个urllib2构建的html下载器的代理组件的实现方案
调用栈/函数链如下: 情形一:下载器初始化时 __init__ buildOpener#构建opener newProxy4Opener#装备代理 getNewProxy#获取代理 maintainP ...
- Android ===smail语法总结
(转载自 网络)smail 语法总结 http://www.blogjava.net/midea0978/archive/2012/01/04/367847.html Smali背景: Smali,B ...
- WinForm(C#)CheckedlistBox绑定数据,并获得选中的值(ValueMember)和显示文本(DisplayMember)
本文中我将和大家讨论关于在WinForm开发中给CheckedlistBox空间绑定数据源,并获取控件中选中的所有元素的显示文本(DisplayMember)和对应的实际值(ValueMember)的 ...
- [置顶] iOS 名片识别代码
采用的是惠普图片识别SDK.本代码可以识别中文.代码改自 http://www.cocoachina.com/bbs/read.php?tid=123463 . 图片就不贴了,123463中的效果是可 ...
- android 怎样内置/预置/预编译文件(运行程序,应用程序,apk, jar, lib 等随意文件)到系统中
方法一: 如果要内置的软件名称为iperf.exe 1. 将iperf.exe放到Codebase的随意一个文件夹下(该文件夹必须可以在搜索Android.mk时被搜索到),比方system/ipe ...
- Linux read/write fread/fwrite两者区别
Linux read/write fread/fwrite两者区别 1,fread是带缓冲的,read不带缓冲. 2,fopen是标准c里定义的,open是POSIX中定义的. 3,fread可以读一 ...
- 当ViewPager嵌套在ScrollView/ListView里时,手势冲突如何处理?
有时我们需要将ViewPager嵌套在其他已经含有手势动作的ViewGroup里,如ScrollView,ListView时,会造成手势冲突,如表现为ViewPager向左划时,不小心向上移动了一点距 ...
- 一些 Windows 系统不常见的 鼠标光标常数
一些 Windows 系统不常见的 鼠标光标常数 Private Declare Function SetCursor Lib "user32" (ByVal hCursor A ...