多态总结

多态总结ios

1、什么是多态?ide

多态就是具备多种形式或形态的情形。在我C++中就是有几个类似却不彻底相同的对象,对这些对象发出同一消息时,这些对象分别执行不一样的操做,完成不一样的功能。函数

2、多态的分类 spa

    wKioL1cTE3CBl5sUAABCadaPpd8883.png

 

3、静态多态对象

 1.函数重载blog

(1)定义ci

 函数重载是指在同一做用域内,能够有一组具备相同函数名不一样参数列表的函数,这组函数被称为重载函数。作用域

(2)注意get

 重载函数的参数个数参数类型参数顺序三者中必须至少有一个不一样。函数返回值能够相同也能够不一样。编译器

(3)程序实例

#include<iostream>

using namespace std;

int Add(int left, int right)

{

return left + right;

}

 

float Add(float left, float right)

{

return left + right;

}

int main()

{

cout << Add(10, 20) << endl;

cout << Add(12.34f, 56.78f) << endl;

system("pause");

return 0;

}

经过实例能够发现,函数重载是怎么调用对应函数的呢!经过函数调用,获取函数名,找到同名函数,而后得到函数各参数表达式类型,同时与实参比较是否匹配,若是匹配则调用该函数,若是没有匹配类型则报错。

4、动态多态

 1.虚函数

 (1)定义

  使用virtual关键字修饰的函数称为虚函数。

(2)注意

  一个类函数的调用并非在编译时刻被肯定,而是在运行时刻被肯定。

(3)程序实例

#include<iostream>

using namespace std;

 

class CBase

{

public:

virtual void FunTest1(int _iTest)

{

cout << "CBase::FunTest1()" << endl;

}

void FunTest2(int _iTest)

{

cout << "CBase::FunTest2()" << endl;

}

virtual void FunTest3(int _iTest1)

{

cout << "CBase::FunTest3()" << endl;

}

virtual void FunTest4(int _iTest)

{

cout << "CBase::FunTest4()" << endl;

}

};

 

class CDerived :public CBase

{

public:

virtual void FunTest1(int _iTest)

{

cout << "CDerived::FunTest1()" << endl;

}

virtual void FunTest2(int _iTest)

{

cout << "CDerived::FunTest2()" << endl;

}

void FunTest3(int _iTest1)

{

cout << "CDerived::FunTest3()" << endl;

}

virtual void FunTest4(int _iTest1, int _iTest2)

{

cout << "CDerived::FunTest4()" << endl;

}

};

 

int main()

{

CBase* pBase = new CDerived;

pBase->FunTest1(0);

pBase->FunTest2(0);

pBase->FunTest3(0);

pBase->FunTest4(0);

CDerived d;

d.FunTest4(0, 0);

d.CBase::FunTest4(0);

system("pause");

return 0;

}

wKioL1cTE73g3jxWAAAhXCXFPvc814.png

(4)总结

1.派生类重写基类的虚函数实现多态,要求函数名、参数列表、返回值彻底相同。(协变除外)

二、基类中定义了虚函数,在派生类中该函数始终保持虚函数的特性。

三、只有类的成员函数才定义为虚函数,静态成员函数不能定义为虚函数。

四、若是在类外定义虚函数,只能在声明函数时加virtual关键字,定义时不用加。

五、构造函数不能定义为虚函数,虽然能够将operator=定义为虚函数,但最好不要这么作,使用时容易混淆。

六、不要在构造函数和析构函数中调用虚函数,在构造函数和析构函数中,对象是不完整的,可能会出现未定义的行为。

七、最好将基类的析构函数声明为虚函数。(析构函数比较特殊,由于派生类的析构函数跟基类的析构函数名称不同,可是构成覆盖,这里编译器作了特殊处理)

八、虚表是全部类对象实例共用的。

相关文章
相关标签/搜索