【学习】C++多态机制
多态:静态(早绑定) 在编译阶段和链接就能确定功能调用的函数。
动态(晚绑定) 在程序运行时根据需要的功能确定调用的函数。
实现晚绑定就要定义虚函数,使用虚函数则会用到基类指针。
继承基类虚成员函数的派生类,其定义的虚函数必须和基类一样(名,参数类型、顺序、个数)。
构造函数不能被继承,也不能定义为虚函数。析构函数可以定义为虚函数。
对于虚析构函数的理解请转向: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++多态机制的更多相关文章
- [转帖]java基础学习总结——多态(动态绑定)
https://www.cnblogs.com/xdp-gacl/p/3644035.html 多态的概念 java基础学习总结——多态(动态绑定) 一.面向对象最核心的机制——动态绑定,也叫多态
- 深入理解Java多态机制
从字节码层面来看,Java中的所有方法调用,最终无外乎转换为如下几条调用指令. invokestatic: 调用静态方法. invokespecial: 调用实例构造器<init>方法,私 ...
- java学习之反射机制
java语言区别于C,C++等准静态语言的最大特点就是java的反射机制.静态语言的最直接定义就是不能在运行时改变程序结构或变量的类型.按照这样的定义,python,ruby是动态语言,C,C++,J ...
- Java多态机制和继承中重写重载
关于Java中多态机制 http://www.cnblogs.com/chenssy/p/3372798.html 这篇博文讲的很透彻 大体意思是 多态定义: 多态就是指程序中定义的引用变量所指向的具 ...
- Java类的多态机制
Java中将一个方法调用同一个方法主体关联起来被称作绑定. 绑定分为前期绑定和后期绑定.前期绑定是在编译器决定的,而后期绑定是在程序运行时决定的.Java中除了static方法和final方法(pri ...
- iOS学习系列 - 扩展机制category与associative
iOS学习系列 - 扩展机制category与associative category与associative作为objective-c的扩展机制的两个特性,category即类型,可以通过它来扩展方 ...
- 【JAVA】笔记(4)---继承;方法覆盖;多态机制;super;
继承(extends): 1.作用:为方法覆盖和多态机制做准备:使代码得到复用(节省代码量): 2.格式: class 子类 extends 父类 3.理解继承:子类继承父类,其实就相当于把父类的类体 ...
- c#学习汇总-----------------多态
刚开通了博客园的博客,原因是我的师兄和前辈们在这里写的一些学习笔记让我受益匪浅,所以决定从今天起用这个平台来记录我的点滴学习心得.我喜欢GIS二次开发,以后应该也不会脱离于此,对于编程我积累的知识太零 ...
- Java学习之反射机制及应用场景
前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...
随机推荐
- angular-cli.json常见配置
{ "project": { "name": "ng-admin", //项目名称 "ejected": false / ...
- 小学生四则运算JAVA
点我,github地址 组员:黄浩格,何坤 一.项目说明 1题目:实现一个自动生成小学四则运算题目的命令行程序. 2说明: 自然数:0, 1, 2, -. • 真分数:1/2, 1/3, 2/3, 1 ...
- 使用AES加密的勒索类软件分析报告
报告名称: 某勒索类软件分析报告 作者: 李东 报告更新日期: 样本发现日期: 样本类型: 样本文件大小/被感染文件变化长度: 样本文件MD5 校验值: da4ab5e31793 ...
- java算法02 - 树
树是一类重要的非线性结构.而二叉树是一种比较重要的树,接下来我们来了解二叉树的相关内容. 二叉搜索树:每个节点都不比它左子树的任意元素小,而且不比它的右子树的任意元素大. /** * 二叉搜索树 O( ...
- 更改TestStep的request header和获取TestStep的response header
更改TestStep的request header for example def userId = "xxxxxxxxxxxxx" def request = context.t ...
- Delphi10.2 关于Http 下载
演示如图: 代码如下: unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Vari ...
- 设计模式二之观察者模式(Subject-Observer)
观察者模式定义了一系列对象之间的一对多关系,当一个主题对象改变状态,其他所有的依赖者都会收到通知. 好了,你可能会觉得上面的描述略微复杂,较难理解,那么现在我们将用一个简单的例子去讲解这个模式. 我们 ...
- 使用datepicker和uploadify的冲突解决(IE双击才能打开附件上传对话框)
在开发的过程当中,IE的兼容无疑是我们的一块绊脚石,在我们使用的如期的datepicker插件和使用上传附件的uploadify插件的时候,两者就产生冲突,只要点击过时间的插件,uploadify上传 ...
- Oracle学习笔记之触发器
触发器 触发器(trigger)是一些过程,与表关系密切,用于保护表中的数据,当一个基表被修改(INSERT.UPDATE或DELETE)时,触发器自动执行,例如通过触发器可实现多个表间数据的一致性和 ...
- Spring Factory
BeanFactory和FactoryBean均为接口: BeanFactory为IOC容器的创建提供了一个最底层的规范,主要方法包括contains(bean), getBean(class, be ...