C++中的多态与虚函数的内部实现方法

2020-01-06 16:11:59王冬梅

1、什么是多态

多态性可以简单概括为“一个接口,多种行为”。

也就是说,向不同的对象发送同一个消息, 不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。这是一种泛型技术,即用相同的代码实现不同的动作。这体现了面向对象编程的优越性。

多态分为两种:

(1)编译时多态:主要通过函数的重载和模板来实现。

(2)运行时多态:主要通过虚函数来实现。

2、几个相关概念

(1)覆盖、重写(override)

override指基类的某个成员函数为虚函数,派生类又定义一成员函数,除函数体的其余部分都与基类的成员函数相同。注意,如果只是函数名相同,形参或返回类型不同的话,就不能称为override,而是hide。

(2)重载(overload)

指同一个作用域出生多个函数名相同,但是形参不同的函数。编译器在编译的时候,通过实参的个数和类型,选择最终调用的函数。

(3)隐藏(hide)

分为两种:

1)局部变量或者函数隐藏了全局变量或者函数
2)派生类拥有和基类同名的成员函数或成员变量。

产生的结果:使全局或基类的变量、函数不可见。

3、几个简单的例子


/****************************************************************************************************** 
* File:PolymorphismTest 
* Introduction:测试多态的一些特性。 
* Author:CoderCong
* Date:20141114 
* LastModifiedDate:20160113 
*******************************************************************************************************/ 
#include "stdafx.h" 
#include <iostream> 
using namespace std; 
class A 
{ 
public: 
  void foo() 
  { 
    printf("1n"); 
  } 
  virtual void fun() 
  { 
    printf("2n"); 
  } 
}; 
class B : public A 
{ 
public: 
  void foo() //由于基类的foo函数并不是虚函数,所以是隐藏,而不是重写 
  { 
    printf("3n"); 
  } 
  void fun() //重写 
  { 
    printf("4n"); 
  } 
}; 
int main(void) 
{ 
  A a; 
  B b; 
  A *p = &a; 
  p->foo(); //输出1。 
  p->fun(); //输出2。 
  p = &b; 
  p->foo(); //输出1。因为p是基类指针,p->foo指向一个具有固定偏移量的函数。也就是基类函数 
  p->fun(); //输出4。多态。虽然p是基类指针,但实际上指向的是一个子类对象。p->fun指向的是一个虚函数。按照动态类型,调用子类函数   
  return 0; 
}

4、运行时多态以及虚函数的内部实现

看了上边几个简单的例子,我恍然大悟,原来这就是多态,这么简单,明白啦!