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

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

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

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

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

  对于虚析构函数的理解请转向: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. Object.create()和new object()和{}的区别

    Object.create()介绍 Object.create(null) 创建的对象是一个空对象,在该对象上没有继承 Object.prototype 原型链上的属性或者方法,例如:toString ...

  2. MFC窗口风格 WS_style/WS_EX_style

    窗口风格(Window style) WS_BORDER   有边框窗口 WS_CAPTION   必须和WS_BORDER风格配合,但不能与WS_DLGFRAME风格一起使用.指示窗口包含标题要部分 ...

  3. MySQL中MyISAM与InnoDB区别

    原文:https://blog.csdn.net/frycn/article/details/70158313?utm_source=copy InnoDB:支持事务处理等不加锁读取支持外键支持行锁不 ...

  4. The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.

    今天用mysql连接数据库时,出现The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than o ...

  5. OpenGL之纹理贴图(Texture)

    学习自: https://learnopengl-cn.github.io/01%20Getting%20started/06%20Textures/ 先上一波效果图: 实际上就是:画了一个矩形,然后 ...

  6. java中外部类和内部类的访问控制符区别

    外部类只有两种访问控制符,即public和default(包访问控制级别).原因:外部类的上一级程序单元是包,所以它只有两种作用域:同一个包内和任何位置,这样只需要用public和default即可, ...

  7. Java探针

    使用java代理来实现java字节码注入 使用JavaSsist可以对字节码进行修改 使用ASM可以修改字节码 使用Java代理和ASM字节码技术开发java探针工具可以修改字节码 备注:javass ...

  8. MySQL存储过程中实现执行动态SQL语句

    sql语句中的任何部分都可以作为参数. DROP PROCEDURE if exists insertdata; delimiter //CREATE PROCEDURE insertdata(IN ...

  9. input()和print()函数同时输入输出多个数据--python3

    使用input()和print()函数同时输入输出多个数据,需要空格分割输入信息 #!/usr/bin/python3#-*- conding:utf-8 -*- name, age, QQ = in ...

  10. 【SHELL】:定时任务删除指定目录

    现有一个需求,需要定时删除积累过久的目录,并且部分目录不可删除.在此,我们分析了一下该父目录的命名结构:非连续性数字命名,部分目录中包含a.txt文件.如下图所示: 在此,我们对此可作如下操作,获取该 ...