当前位置:   article > 正文

静态多态 动态多态_静态多态和动态多态

静态多态和动态多态

一. 静态多态

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 ) {}
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

以上,类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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
运行结果
A::f() is called.
A::f() is called.
  • 1
  • 2

在这种情况下,我们会发现程序的输出结果并不是我们想要的,而是两次调用的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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
运行结果
A::f() is called.
B::f() is called.
  • 1
  • 2

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

三. 总结

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/427690
推荐阅读
相关标签
  

闽ICP备14008679号