C++面向对象之初始多态(一)

C++面向对象之多态(一)

  • 多态的概念

    同一个事物,在不同场景下表现多种形态.这里举一个牵强的列子列如C/c++语言中的*,int *p=&a表示指针,*p表示解引用,a*b中表示乘号

  • 多态的分类

    A>静态多态:编译期间完成的,编译器根据函数实参的类型,推断出具体该调用哪一个函数.

      a>函数重载

      b>泛型编程

    B>动态多态:程序运行时确定,运行时判断对象的实际类型,根据实际类型确定具体调用的函数

  • 动态多态实现的条件

  A>基类中必须包含虚函数,在派生类必须对基类的虚函数进行重写

   B>必须通过基类对象的指针或者引用调用虚函数

重写的概念:a>在继承体系中,不同的作用域下(分别在基类和派生类)

           b>基类中函数必须为虚函数

           c>派生类中重写的虚函数必须与基类的虚函数的原型保持一致.注意这里有两个列外①(协变列外--返回类型不同:基类中虚函数返回基类对象的指针或者引用,派生类中返回派生类对象的指针或者引用)②(析构函数--函数名不同:基类和派生类函数名不同)

  • 多态实现
#include<iostream>
using namespace std;
class V_Base
{
public:
	virtual void Fun_Virtual_1()
	{
		cout << "V_Base::Fun_Virtual_1()" << endl;
	}
	virtual void Fun_Virtual_2()
	{
		cout << "V_Base::Fun_virtual_2()" << endl;
	}
private:
	int _b;
};
class V_Derived:public V_Base
{
public:
	virtual void Fun_Virtual_1()
	{
		cout << "V_Derived::Fun_Virtual_1()" << endl;
	}
	virtual void Fun_Virtual_3()
	{
		cout << "V_Derived::Fun_virtual_3()" << endl;
	}
private:
	int _d;
};
void Test_Virtual(V_Base &b){
	b.Fun_Virtual_1();
	b.Fun_Virtual_2();
}
int main(){
	V_Base b;
	V_Derived d;
	Test_Virtual(b);
	Test_Virtual(d);
	return 0;
}
  • 多态调用过程
在此之前我们先看一下上述代码,基类和派生类对象的模型:

上述可知:创建对象时:在合成的构造函数中,在对象的前4个字节保存了指向虚函数的指针(虚表指针),该指针指向一个虚表,虚表里保存着该类的虚函数,在vs2010版最后一个虚函数后面暴保存了00000000.

调用过程:1>从对象的前四个字节中取出虚表的地址,2>传参(虚函数的形参+当前对象的this指针)3>从虚表中取出虚函数的地址.4>调用该虚函数.


  • 多态缺陷
   实现多态就要借助虚函数,普通函数直接调用,而对于虚函数而言需要通过对象去找虚表,继而找到虚函数的地址,再执行函数,降低了程序的效率

   


猜你喜欢

转载自blog.csdn.net/sx2448826571/article/details/80948227
今日推荐