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

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

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

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

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

  对于虚析构函数的理解请转向: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. 用jackson包实现json、对象、Map之间的转换

    jackson API的使用 用jackson包实现json.对象.Map之间的转换

  2. 汽车行业解决方案_K2助力车企实现费控/生产“端到端流程”

    如今汽车行业正面对一轮全球范围内新变革周期,这种“变革”一方面来源于在新能源技术.人工智能.信息技术.物联网技术等高新科技地猛烈敲击,另一方面源于全球的经济政策变幻莫测,贸易保护时代地到来,车企深陷发 ...

  3. 关于Phabricator Arcanist以及提交项目代码

    git配置 github的使用:https://github.com/runchen0518/OnlineJudge/blob/master/README.md $ git config --glob ...

  4. 聚类--K均值算法

    import numpy as np from sklearn.datasets import load_iris iris = load_iris() x = iris.data[:,1] y = ...

  5. java导出Excel定义导出模板

    在很多系统功能中都会有Excel导入导出功能,小编采用JXLS工具,简单.灵活. JXLS是基于 Jakarta POI API 的Excel报表生成工具,它采用标签的方式,类似于jsp页面的EL表达 ...

  6. 分享我编写的powershell脚本:ssh-copy-id.ps1

      问:通过[字符串界面].如何从win,通过ssh,连接到sshd?答:在任意版本win中,通过cmd.exe,powershell.exe中调用ssh.exe,连接sshd.   问:通过[pow ...

  7. ftp 发布配置

    地址:ftp://192.168.26.128/ 存放文件夹:jenkins

  8. vs code 本地请求json

    首先下载扩展live server 重新加载后 右下方工具栏会多出一个go live 点击go live,会默认启动chome,地址  http://127.0.0.1:5500 js脚本: $.aj ...

  9. LimeSDR 无线信号重放攻击和逆向分析

    原文链接:https://mp.weixin.qq.com/s/TBYKZR3n3ADo4oDkaDUeIA

  10. dos4章

    批处理中的变量,我把他分为两类,分别为"系统变量"和"自定义变量" 我们现在来详解这两个变量! 一.系统变量 他们的值由系统将其根据事先定义的条件自动赋值,也就 ...