【学习】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注解框 ...
随机推荐
- 页面显示LCD液晶字体或者其他特殊字体
如果web项目中需要用到LCD液晶字体显示数值(如下图所示)该怎么办? 在这就需要用到@font-face(具体看一下语法) /* 定义 */ @font-face { font-family: 'M ...
- 洛谷P2886 [USACO07NOV]牛继电器Cow Relays
题意很简单,给一张图,把基本的求起点到终点最短路改成求经过k条边的最短路. 求最短路常用的算法是dijkstra,SPFA,还有floyd. 考虑floyd的过程: c[i][j]=min(c[i][ ...
- JavaScript 进阶
字符串方法 ① charAt() 方法可返回指定位置的字符 ② indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置 ③ split() 方法将字符串分割为字符串数组,并返回此数组 ...
- HDFS(二) 底层通信原理——RPC 及 动态代理
一.RPC(Remote Procedure Call ) :远程过程调用 1.RPC是远程过程调用协议,实现调用者和被调用者二地之间的连接和通信.其基本通信模型是基于client/server进程 ...
- Unity 关于AssetBundle读取场景
一. 1.关于如何打包成ab包,就不多说了,网上很多教程,siki学院也有siki老师的免费视频教程挺详细的,可以看看 http://www.sikiedu.com/my/course/74 2.为了 ...
- MobX+react使用小demo
第一次接触mobx,网上找了很多例子,写此主要总结一下create-react-app + mobx入门 create-react-app myreact cd myreact npm install ...
- Eclipse远程调试+FTPClient在jdk6以上写法不兼容问题的排查
业务场景: 应业务新需求的UAT测试,需要部署一份新tomcat到测试环境.新环境正常启动并运行了一天,没太大差错.但今天发现原本在另一个老的tomcat下运行的好好的FTP上传文件模块突然出了问题. ...
- javascript Base64转码解码
javascript 使用btoa和atob来进行Base64转码和解码 $scope.checkAddCookie = function() { var expireDate = new Date( ...
- tar: Exiting with failure status due to previous errors
发生在tar压缩或者解压缩的过程中,原因是压缩包在建立的时候是用了sudo的,所以你解压的时候也要加上sudo,问题就很好解决了的
- maven快速自动更新子模块项目的版本号
当一个版本发布,新起一个版本时,我们需要更改一下项目中的版本号.一个maven工程,如果只是一个单一的主项目,那么只要手动修改一下 pom.xml 就 可以了,耗不了多少时间.但是如果这个maven项 ...