多态:静态(早绑定)  在编译阶段和链接就能确定功能调用的函数。

      动态(晚绑定)  在程序运行时根据需要的功能确定调用的函数。

实现晚绑定就要定义虚函数,使用虚函数则会用到基类指针。

继承基类虚成员函数的派生类,其定义的虚函数必须和基类一样(名,参数类型、顺序、个数)。

构造函数不能被继承,也不能定义为虚函数。析构函数可以定义为虚函数。

  对于虚析构函数的理解请转向:https://blog.csdn.net/xld_hung/article/details/76776497

基类指针指向派生类对象,并通过基类指针调用派生类对象的虚函数,这样实现多态。

IShape.h     定义抽象类

 #ifndef _ISHAPE_H_
#define _ISHAPE_H_
#include<string>
//---定义抽象类形状
using namespace std;
//interface类
//---声明接口函数
class IShape
{
public:
virtual float getArea() = ; //纯虚函数,获得面积
virtual string getName() = ; //纯虚函数,返回图形的名称
//---声明纯虚函数的类在子类中定义函数具体的实现功能(?)
//---抽象类不能创建对象,但可以创建自己的指针
};
#endif

Circle.h

 #ifndef CIRCLE_H
#define CIRCLE_H
#include"IShape.h"
//---定义圆形类
class CCircle : public IShape //公有继承自IShape类
{
public:
CCircle(float radius); //构造函数
virtual float getArea(); //声明两个基类的函数,声明的时候需要加virtual关键字,实现的时候就不需要加virtual关键字了。
virtual string getName();
private:
float m_fRadius; //派生类可以拥有自己的成员
//---圆的属性:半径
};
#endif

Rect.h

 #ifndef RECT_H
#define RECT_H
#include"IShape.h"
//---定义矩形类
class CRect : public IShape
{
public:
CRect(float nWidth, float nHeight);
virtual float getArea();
virtual string getName();
private:
float m_fWidth; //矩形类具有自己的两个属性,宽和高
float m_fHeight;
};
#endif

Circle.cpp

 #include"Circle.h"
//---实现圆形类的函数
CCircle::CCircle(float radius):m_fRadius(radius) //使用构造函数的初始化列表初始化
{}
//---在使用构造函数的时候将形参的值传递给圆形类的m_fRadius float CCircle::getArea() //实现实现两个基类的函数
{
return 3.14 * m_fRadius * m_fRadius;//---求面积
} string CCircle::getName()
{
return "CCircle";
}

Rect.cpp

 #include"Rect.h"
//---实现方形类的函数
CRect::CRect(float fWidth, float fHeight):m_fWidth(fWidth), m_fHeight(fHeight){} float CRect::getArea()
//---定义矩形类的成员函数getArea()
{
return m_fWidth * m_fHeight;//---返回面积
} string CRect::getName()
{
return "CRect";//---返回名字
}

main.cpp  

 #include<iostream>
#include"Rect.h"
#include"Circle.h" using namespace std; int main() {
int i = ;
IShape* pShape = NULL;
//定义了一个抽象类的指针,注意抽象类不能定义对象但是可以定义指针 pShape = new CCircle(2.0);
//基类指针指向派生类的对象 cout << pShape->getName() << "-" << pShape->getArea() << endl;
//---通过基类指针调用派生类函数须使用'->'符号 delete pShape;
//释放了CCirle对象所占的内存,但是指针是没有消失的,它现在就是一个野指针,我们在使用之前必须对它赋值 pShape = new CRect(, ); //基类指针指向另一个派生类的对象
cout << pShape->getName() << "-" << pShape->getArea() << endl;
cin >> i;//---窗口一闪就没了,我就随便加了一段停一下
return ; }

原文链接:http://www.maiziedu.com/wiki/cplus/forms/

【学习】C++多态机制的更多相关文章

  1. [转帖]java基础学习总结——多态(动态绑定)

    https://www.cnblogs.com/xdp-gacl/p/3644035.html 多态的概念 java基础学习总结——多态(动态绑定) 一.面向对象最核心的机制——动态绑定,也叫多态

  2. 深入理解Java多态机制

    从字节码层面来看,Java中的所有方法调用,最终无外乎转换为如下几条调用指令. invokestatic: 调用静态方法. invokespecial: 调用实例构造器<init>方法,私 ...

  3. java学习之反射机制

    java语言区别于C,C++等准静态语言的最大特点就是java的反射机制.静态语言的最直接定义就是不能在运行时改变程序结构或变量的类型.按照这样的定义,python,ruby是动态语言,C,C++,J ...

  4. Java多态机制和继承中重写重载

    关于Java中多态机制 http://www.cnblogs.com/chenssy/p/3372798.html 这篇博文讲的很透彻 大体意思是 多态定义: 多态就是指程序中定义的引用变量所指向的具 ...

  5. Java类的多态机制

    Java中将一个方法调用同一个方法主体关联起来被称作绑定. 绑定分为前期绑定和后期绑定.前期绑定是在编译器决定的,而后期绑定是在程序运行时决定的.Java中除了static方法和final方法(pri ...

  6. iOS学习系列 - 扩展机制category与associative

    iOS学习系列 - 扩展机制category与associative category与associative作为objective-c的扩展机制的两个特性,category即类型,可以通过它来扩展方 ...

  7. 【JAVA】笔记(4)---继承;方法覆盖;多态机制;super;

    继承(extends): 1.作用:为方法覆盖和多态机制做准备:使代码得到复用(节省代码量): 2.格式: class 子类 extends 父类 3.理解继承:子类继承父类,其实就相当于把父类的类体 ...

  8. c#学习汇总-----------------多态

    刚开通了博客园的博客,原因是我的师兄和前辈们在这里写的一些学习笔记让我受益匪浅,所以决定从今天起用这个平台来记录我的点滴学习心得.我喜欢GIS二次开发,以后应该也不会脱离于此,对于编程我积累的知识太零 ...

  9. Java学习之反射机制及应用场景

    前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...

随机推荐

  1. POJO、JavaBean、DTO的区别

    一.POJO(Plain Ordinary Java Object)简单的Java对象,其中有一些属性及其getter setter方法的类,没有业务逻辑(重点理解一下"没有业务逻辑&quo ...

  2. python中的unique()

    a = np.unique(A) 对于一维数组或者列表,unique函数去除其中重复的元素,并按元素由大到小返回一个新的无元素重复的元组或者列表 import numpy as np A = [1, ...

  3. 在用单片机接受串口数据的时候,第一位是0x0A

    unsigned char data len=0; //命令字符串长度if(RI) //如果数据已经接收完,即RI=1{ RI=0; //对RI进行清零 cmd_buf[counter] = SBUF ...

  4. python笔记22-常用模块

    模块就是一个python文件,用哪个模块就要import哪个模块 1.调用模块 # import model #import的本质就是把这个python从头到尾执行一遍## model.run1()# ...

  5. .NET界面控件DevExpress发布v18.2.8|附下载

    DevExpress Universal Subscription(又名DevExpress宇宙版或DXperience Universal Suite)是全球使用广泛的.NET用户界面控件套包,De ...

  6. web应用及web.xml

    一.创建web应用 1.在任意目录新建webDemo文件夹 2.在webDemo下新建WEB-INF文件夹(注意大小写) 3.在WEB-INF中新建web.xml文件(可以copy已有的web应用中的 ...

  7. 今天捡起来python

    时隔多少,我还是要学习,之前懒,结果有些就忘了,用笨方法学Python,码代码夹理解运行改正也就20多分钟,主要是加分习题,你一扩展就要思考的时间长了所以大概要留出1个小时来做他,好了该复习前面的了

  8. VFS 上传文件到sftp 报错 包含中文路径 或者中文文件名称

    之前用Apache commons-vfs工具进行ftp操作(FTP服务器是 FileZilla Server) 上传本地文件 到 ftp服务器上,如果文件名称 包含 中文 报错 org.apache ...

  9. mysql安装(centos 7)

    1.安装依赖 yum install -y cmake make gcc gcc-c++ libaio ncurses ncurses-devel cd /usr/local/src 链接:https ...

  10. ios中iframe页面出现白屏问题

    最近用ionic3开发的一个项目在ios中出现了白屏的问题 banner轮播图跳转网页 使用了iframe 但是却时不时的出现白屏现象 在android中一切正常 网上查资料发现 是因为ios不允许访 ...