C++中多态是面向对象设计思想的重要特性,同名具有不同功能函数,该函数调用过程执行不同的功能。多态的原理是通过一张虚函数表(Virtual Table)实现的。动多态会牺牲一些空间和效率来最终实现动态绑定。

静多态

函数重载为静多态,绑定发生在编译期间,根据函数的参数来确定调用哪个函数。

#include <iostream>

using namespace std;

void foo(int a, int b)
{
cout << "foo(int a, int b)" << endl;
} void foo(double a, double b)
{
cout << "foo(float a, float b)" << endl;
} int main()
{
foo(1, 2);
foo(1.1, 2.2); return 0;
}

动多态

动多态不是在编译阶段决定的,而是在程序运行时根据基类的指针(引用)指向的对象来决定调用哪个类的虚函数。

动多态实现的条件:

1.基类中有虚函数。

2.派生类中重写基类中的虚函数。

3.父类的指针指向子类对象,调用共用的接口。

虚函数使用格式:

class 类名

{

    virtual 函数声明;

};

#include <iostream>

using namespace std;

class Animal
{
public:
Animal()
{
cout << "Animal()" << endl;
} virtual void eating()
{
cout << "animal is eating!" << endl;
} virtual ~Animal() //虚析构,保证析构完全
{
cout << "~Animal()" << endl;
}
}; class Dog:public Animal
{
public:
Dog()
{
cout << "Dog()" << endl;
} void eating()
{
cout << "Dog is eating!" << endl;
} ~Dog()
{
cout << "~Dog()" <<endl;
}
}; int main()
{
Animal *ani = new Dog;
ani->eating();
delete ani; return 0;
}

注意:含有虚函数的类,析构函数也要声明为虚函数,为虚析构函数。如果上代码virtual ~Animal()改为~Animal(),运行结果如下:

明显析构不完全,虚析构可以调用派生类的析构函数,保证了完整析构。

纯虚函数

纯虚函数时在基类中声明的虚函数,没有实现体,在函数原型后加“=0”,使用格式:

class 类名
{ virtual 函数声明 = 0; };

1.含有纯虚函数的类称为纯虚基类,又称抽象基类(Abstract Base Class),抽象类不能进行实例化,可以继承,提供类的公共接口,在派生类中实现,类似java中Interface。

2.如果基类中声明了纯虚函数,派生类中没有实现该方法,则在派生类中仍然为纯虚函数,该派生类仍为纯虚基类。

#include <iostream>

using namespace std;

class Animal
{
public:
Animal()
{
cout << "Animal()" << endl;
} virtual void eating() = 0; virtual ~Animal()
{
cout << "~Animal()" << endl;
}
}; class Dog:public Animal
{
public:
Dog()
{
cout << "Dog()" << endl;
} void eating()
{
cout << "Dog is eating!" << endl;
} ~Dog()
{
cout << "~Dog()" <<endl;
}
}; int main()
{
Animal *ani = new Dog;
ani->eating();
delete ani; return 0;
}

【C++札记】多态的更多相关文章

  1. final关键字、多态 (札记)

    目录 protected fianl 子父类中同名的 private 方法 java中的前期绑定 免疫多态 谁先被执行,构造器 还是 初始化? 协变返回类型 <Thinking in java& ...

  2. java学习札记

    java学习札记 0x0 学习原因  本来打算大三再去跟着课程去学习java的,但是现在题目越来越偏向java,所以迫于无奈开启了java的学习篇章,同时也正好写个笔记总结下自己学习一门语言的流程. ...

  3. Java中的多态

    1.多态:具有表现多种形态的能力的特征 父类: public abstract class Animal {public abstract void Say();} 子类: public class ...

  4. C# 工厂模式+虚方法(接口、抽象方法)实现多态

    面向对象语言的三大特征之一就是多态,听起来多态比较抽象,简而言之就是同一行为针对不同对象得到不同的结果,同一对象,在不同的环境下得到不同的状态. 实例说明: 业务需求:实现一个打开文件的控制台程序的d ...

  5. C#非常重要基础之多态

    前几天看了一位同志的博客,写的是关于他自己去支付宝面试的经历.过程大体是这样的:问答的时候,前面部分,作者都应答如流,说起自己经验如何之丰富,最后面试官问了作者一个问题:请简述多态的概念和作用.结果这 ...

  6. C++多态详解

    多态是面向对象的程序设计的关键技术.多态:调用同一个函数名,可以根据需要但实现不同的功能.多态体现在两个方面,我们以前学过的编译时的多态性(函数重载)和现在我们这一章将要学习的运行时的多态性(虚函数) ...

  7. 【那些年关于java多态应用】

    1.多态:具有表现多种形态的能力的特征 父类: public abstract class Animal { public abstract void Say();} 子类: public class ...

  8. JAVA多态

    多态是指当系统A访问系统B的服务时,系统B可以通过多种方式来提供服务,而这一切对系统A是透明的.比如动物园的饲养员能够给各种各样的动物喂食.下图显示了饲养员Feeder,食物Food和动物Animal ...

  9. C#多态“说来也说”——逻辑层BLL中的多态使用

    本文版权归博客园和作者吴双本人共同所有.欢迎转载,转载和爬虫请注明原文地址 http://www.cnblogs.com/tdws/p/5861842.html 昨天晚上,有个朋友说学了好久,依然没搞 ...

随机推荐

  1. 小程序支付及H5支付前端代码小结

    小程序支付和H5支付前端都不需要引入其他的js , 只需要后台将相关的参数 ( timeStamp: '', nonceStr: '', package: '', signType: 'MD5', p ...

  2. java 练习(公司年销售额求和)

    /*B:公司年销售额求和 某公司按照季度和月份统计的数据如下:单位(万元) 第一季度:22,66,44 第二季度:77,33,88 第三季度:25,45,65 第四季度:11,66,99 */ int ...

  3. 单页面应用程序(SPA)

    一.概念 ①在一个页面上实现网站的大部分功能,就是单页面应用程序,是一种常见的网页开发模式. ②整个网站就只有一个Html文件,每次在切换页面时,不需要请求服务器,只要通过本地的js来切换即可.这样可 ...

  4. xamarin/xamarin.forms 在锁屏电源唤醒时保持后台运行

    PARTIAL_WAKE_LOCK:保持CPU 运转,屏幕和键盘灯有可能是关闭的. SCREEN_DIM_WAKE_LOCK:保持CPU 运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯 SCRE ...

  5. C Primer Plus--高级数据结构之二叉树

    目录 二叉搜索树 Binary Search Tree 用C构建二叉树ADT 树结构的定义 C Primer Plus--高级数据结构表示之二叉树 二叉搜索树 Binary Search Tree 二 ...

  6. Java为什么没有指针

    为了摒弃指针带来的风险(当然了,也就放弃了指针带来的效率). 1.C/C++为什么有指针? 这个很简单,程序都是在内存中运行的,只要有内存,就有内存地址,有地址,就必然有指针,只是C++对内存地址的访 ...

  7. SpringMVC自定义类型转换器

    SpringMVC 自定义类型转换器  我们在使用SpringMVC时,常常需要把表单中的参数映射到我们对象的属性中,我们可以在默认的spring-servlet.xml加上如下的配置即可做到普通数据 ...

  8. CSS背景和精灵图

    如何设置背景图片? 1.在CSS中有个叫做background-image:url():的属性,就是专门用于设置背景图片的. 2.注意点: 1)图片的地址必须放在url()中,图片的地址可以是本地的地 ...

  9. CentOS下启动和停止Tomcat

    启动Tomcat: 进入tomcat目录/bin,然后./startup.sh 停止Tomcat: 进入tomcat目录/bin,然后./shutdown.sh

  10. Oracle系列六 分组函数

    分组函数作用于一组数据,并对一组数据返回一个值. 组函数类型 AVG COUNT MAX MIN STDDEV SUM 组函数语法 SELECT [column,] group_function(co ...