C/C++ 静态多态与动态多态

  静态多态就是在系统编译期间就可以确定程序执行到这里将要执行哪个函数,比如函数的重载。

  动态多态则是利用虚函数实现了运行时的多态,也就是说在系统编译的时候并不知道程序将要调用哪一个函数,只有在运行到这里的时候才能确定接下来会跳转到哪一个函数的栈帧。

  虚函数就是在基类中声明该函数是虚拟的(在函数之前加virtual关键字),然后在子类中正式的定义(子类中的该函数的函数名,返回值,函数参数个数,参数类型,全都与基类的所声明的虚函数相同,此时才能称为重写,才符合虚函数,否则就是函数的重载),再定义一个指向基类对象的指针,然后使该指针指向由该基类派生的子类对象,再然后用这个指针来调用改虚函数,就能实现动态多态。

  函数名称相同情况下:

  重载(作用域相同,参数个数或顺序或类型不同,无论是否虚函数)。本质上是不同函数。

  覆盖(或称重写,作用域不同,参数个数顺序类型相同,必须是虚函数)。本质是在继承时替换虚函数表对应的函数地址。

  隐藏(作用域不同,参数无论是否相同,无论是否虚函数)。发生在从父作用域进入子作用域时。

  结论,作用域相同必须是重载否则重定义,作用域不同时如果参数相同且是虚函数则为覆盖否则为隐藏。

  对于重载:

  const type与type不构成重载

  const type&与type&构成重载

  const type*与type*构成重载

原文地址:https://www.cnblogs.com/dailycode/p/9595696.html

时间: 2024-11-11 13:37:15

C/C++ 静态多态与动态多态的相关文章

C++ 静态多态和动态多态 浅析

今天的C++已经是个多重泛型编程语言(multiparadigm programming lauguage),一个同时支持过程形式(procedural).面向对象形式(object-oriented).函数形式(functional).泛型形式(generic).元编程形式(metaprogramming)的语言. 这些能力和弹性使C++成为一个无可匹敌的工具,但也可能引发使用者的某些迷惑,比如多态.在这几种编程泛型中,面向对象编程.泛型编程以及很新的元编程形式都支持多态的概念,但又有所不同.

静态多态和动态多态

多态 多态就是多种形态,C++的多态分为静态多态和动态多态. 静态多态就是重载,因为是在编译期决议确定,所以称为静态多态. 动态多态就是通过继承重写基类的虚函数实现的多态,因为是在运行时决议确定,所以称为动态多态. class Base { public : virtual void func1() { cout<<"Base::func1" <<endl; } virtual void func2() { cout<<"Base::fun

polymorphism-多态(函数多态、宏多态、静态多态、动态多态)

多态(polymorphism) 字面上意思--多种形态,即同一种方法的行为随上下文而异. 维基百科:Polymorphism (computer science), the ability incomputer programming to present the same interface for differing underlyingforms (data types). 1.函数多态(function polymorphism):也即是函数重载(functionoverloading

静态多态与动态多态

面向对象编程的多态从绑定时间来看,可以分成静态多态和动态多态,也称为编译期多态和运行期多态. java中overload是静态多态,即根据参数列表进行最佳匹配,在编译阶段决定要具体执行哪个方法.而与之相反,overriden methods则是在run-time进行动态检查. 举例说明: public class UseAnimals { public void doStuff(Animal a) { System.out.println("Animal"); } public voi

OC多态,动态类型绑定

// //  main.m //  OC7类 // //  Created by Zoujie on 15/8/23. //  Copyright (c) 2015年 Zoujie. All rights reserved. // #import <Foundation/Foundation.h> #import "Fraction.h"//导入头文件 #import "Complex.h" #define Choose  0 int main(int 

分析多继承下的动态多态。

一.首先我们先了解一下三个概念: 1.重载.2.隐藏.3.覆盖(重写) 如何实现重载?--2个条件: 1-在同一作用域内. 2-两个函数函数名相同,参数不同,返回值可以不同. 此时两个函数就实现了重载,当然这是C++对于C特有的,因为C的时候对参数并没有太多的考虑,C++的编译器在编译时对函数进行了重命名,所以就算是函数名相同的函数,如果参数不同,就会是不同的函数,对应不同的情况. 如何实现隐藏/重定义?--2个条件: 1-在不同作用域下,大多在继承上体现. 2-函数名相同即可. 例如在 B类公

浅谈为什么只有指针能够完成多态及动态转型的一个误区

c++多态由一个函数地址数组Vtable和一个指向Vtable的指针vptr实现. 具体来说,类拥有自己的vtable,类的vtable在编译时刻完成. 每个对象有自己的vptr指针,该指针初始化时指向对象所实现的类的vtable. 关于向上转型的误区: 通常对于向上转型的理解是这样的,当子类对象向上转型(允许隐式)成父类对象时,实际上只是将子类对象暂时看做父类对象,内部的数据并未改变. 对于没有虚函数的对象,这句话是正确的,但是,当引入虚函数后,这样的理解是有问题的,实际上,向上转型的过程中,

动态多态

public interface Ipower { public abstract void tigongdianyuan(); } 动态多态:指系统A访问系统B的服务时,系统B可以通过多种实现来提供服务,而这一切对于A来说都是透明的 public class ACPower implements Ipower { public void tigongdianyuan() { System.out.println("适配器提供电源"); } } public class Barry i

第一次接触OC多态,动态类型与动态绑定

多态:允许不同的类定义相同的方法. 动态类型:程序直到执行时才能确定所属的类. 动态绑定:程序直到执行时才能确定实际要调用的方法. id类型:一种通用的对象类型,也就是说,id可以用来存储属于任何类的对象,让不同类的输出不用特定设定,通用一个id类型就好. 多态的出现时为了让不同的类能使用同明的方法.比如add,这个让程序的可读性大大提高,也降低了编程难度.add就是+,哪种类型的+都用add标明方法,清晰易懂. 动态类型与动态绑定是为了解决随多态的便利而引起的弊端,有了动态类型与动态绑定,不用