静态多态 动态多态

原创 2018年04月15日 19:00:38

一. 静态多态

1. 何为静态多态?

又称编译期多态,即在系统编译期间就可以确定程序将要执行哪个函数。例如:函数重载,通过类成员运算符指定的运算。

2. 示例代码

函数重载示例:

class A {
public:
    A() {}
    A( int x ) {}
    void f() {}
    void f( int x ) {}
};

class B {
public:
    B() {}
    void f() {}
    void f( int x ) {}
};

以上,类A中两个A()是函数重载,两个f()是函数重载,类B同理。

二. 动态多态

1. 何为动态多态?

动态多态是利用虚函数实现运行时的多态,即在系统编译的时候并不知道程序将要调用哪一个函数,只有在运行到这里的时候才能确定接下来会跳转到哪一个函数。
动态多态是在虚函数的基础上实现的,而实现的条件有:
(1) 在类中声明为虚函数
(2) 函数的函数名,返回值,函数参数个数,参数类型,全都与基类的所声明的虚函数相同(否则是函数重载的条件)
(3) 将子类对象的指针(或以引用形式)赋值给父类对象的指针(或引用),再用该指向父类对象的指针(或引用)调用虚函数
如此,便可以实现动态多态,程序会按照实际对象类型来选择要实行的函数具体时哪一个。

2. 示例代码

(1) 非多态

#include <iostream>
using namespace std;

class A {
public:
    A() {}
    void f() { cout << "A::f() is called.\n"; }
};

class B : public A {
public:
    B() {}
    void f() { cout << "B::f() is called.\n"; }
};

int main() {
    A a;
    B b;

    A *p1 = &a;
    A *p2 = &b;

    p1->f();
    p2->f();

    return 0;
}
运行结果
A::f() is called.
A::f() is called.

在这种情况下,我们会发现程序的输出结果并不是我们想要的,而是两次调用的f()函数都是基类的。这是因为使用的是基类指针,而且基类中没有将f()声明为虚函数,所以每次调用都会使用基类的方法。

(2)多态

#include <iostream>
using namespace std;

class A {
public:
    A() {}
    virtual void f() { cout << "A::f() is called.\n"; }
};

class B : public A {
public:
    B() {}
    virtual void f() { cout << "B::f() is called.\n"; }
};

int main() {
    A a;
    B b;

    A *p1 = &a;
    A *p2 = &b;

    p1->f();
    p2->f();

    return 0;
}
运行结果
A::f() is called.
B::f() is called.

这样,也就实现了动态多态,程序可以按照我们期望的方式正确输出。

三. 总结

建议在基类中,如果含有虚函数,就将类的析构函数声明为虚析构函数,以避免在调用时发生错误。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liushall/article/details/79947910

《赤壁》学习笔记(一)

早就听说《赤壁》游戏是在国产游戏中的先驱,后来听说销售情况不是很好,干脆就把源码卖了,也就是业内人士常说的《G档案》。我费尽千辛万苦,在网上下载到了源码和标准版的游戏执行档。  分析了CBMain.C...
  • ysb
  • ysb
  • 2002-07-06 23:29:00
  • 1648

静态多态和动态多态

面向对象编程的多态从绑定时间来看,可以分成静态多态和动态多态,也称为编译期多态和运行期多态。 应用形式上: 静多态是发散式的,让相同的实现代码应用于不同的场合。 动多态是收敛式的,让...
  • John_62
  • John_62
  • 2017-03-16 16:08:57
  • 865

C++多态简析——静态多态与动态多态

多态:顾名思义,多态就是多种形态,也就是对不同对象发送同一个消息,不同对象会做出不同的响应。并且多态分为静态多态和动态多态。静态多态就是在系统编译期间就可以确定程序执行到这里将要执行哪个函数,例如:函...
  • stay_the_course
  • stay_the_course
  • 2017-02-16 16:01:54
  • 2426

Java的多态(静态绑定和动态绑定)

参考资料:http://blog.csdn.net/lingzhm/article/details/44116091java多态具体表现形式有两种:方法的重写和方法的重载。先来看一段程序(此段代码摘自...
  • zlp1992
  • zlp1992
  • 2016-09-16 19:52:51
  • 1306

动态多态与静态多态

多态的字面含义:具有多种不同的形态。 关键字:重载/模版和虚函数 类型:编译期多态(静态多态,早绑定)和运行期多态(晚绑定) 编译期多态(重载/模版): 重载 int getMax(int ...
  • QQ575787460
  • QQ575787460
  • 2013-01-25 17:10:07
  • 10936

C#基础学习之【3】多态与静态对象的使用1

1、多态的使用 using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplic...
  • yuxikuo_1
  • yuxikuo_1
  • 2015-02-04 17:42:51
  • 563

Java静态多态性和动态多态性有何区别

静态多态性指的是程序在编译时,系统就能决定调用哪个函数,如重载。 动态多态性指在运行中才能动态确定操作指针所指的对象,主要通过虚函数和重写来实现。 java 的多态机制遵循一个原则:当父类对象引用...
  • qqlrq
  • qqlrq
  • 2014-08-06 09:33:26
  • 779

C++静态多态,动态多态

//1.参数多态   //包括函数模板和类模板   //2.包含多态  virtual   class A{       virtual void foo() {       ...
  • dragonaxz
  • dragonaxz
  • 2016-10-31 15:32:10
  • 463

C++的动态多态和静态多态

Static and Dynamic Polymorphism in C++  多态是 C++中面向对象技术的核心机制之一 包含静态多态和动态多态 它们之间有一定的相似性 述...
  • Chen_Yilong
  • Chen_Yilong
  • 2013-03-12 11:20:05
  • 1877

Java:Java静态多态性与动态多态性

静态多态性指的是程序在编译时,系统就能决定调用哪个函数,如重载。 动态多态性指在运行中才能动态确定操作指针所指的对象,主要通过虚函数和重写来实现。 java 的多态机制遵循一个原则:当父类对象引用...
  • HMYANG314
  • HMYANG314
  • 2014-10-11 17:18:08
  • 1692
收藏助手
不良信息举报
您举报文章:静态多态 动态多态
举报原因:
原因补充:

(最多只允许输入30个字)