多态基本概念

1、为什么要引入多态机制?

多态机制可提高程序的可扩充性(即程序需要修改或增加功能的时候,需要改动和增加的代码较少)。支持类、对象、继承,但是不支持多态的语言应该称为基于对象的语言(例如:VB)。而支持多态的语言才能称为面向对象的语言。

2、虚函数

(1) 什么叫虚函数?
在类的定义中,前面有 virtual 关键字的成员函数就是虚函数。

class base {
	virtual int get() ;
};

int base::get()
{ }

注意:virtual 关键字只用在类定义里的函数声明中,写函数体时不用。
(2)虚函数与普通函数的区别
普通函数与虚函数的区别在于:虚函数能够参与多态,但是普通函数不能。

3、什么是多态?

多态有两种表现形式:
(1)派生类的指针可以赋给基类指针。(公有继承的赋值兼容规则)
通过基类指针调用基类和派生类中的同名虚函数时:

  • 若该指针指向一个基类的对象,那么被调用是基类的虚函数;
  • 若该指针指向一个派生类的对象,那么被调用的是派生类的虚函数。

这种机制就叫做“多态”
举栗子:

class CBase {
public:
	virtual void SomeVirtualFunction() { }
};

class CDerived:public CBase {
public :
	virtual void SomeVirtualFunction() { }
};

int main() {
	CDerived ODerived;
	CBase * p = & ODerived;
	p -> SomeVirtualFunction(); //调用哪个虚函数取决于p指向哪种类型的对象
	return 0;
}

(2)派生类的对象可以赋给基类引用。(公有继承的赋值兼容规则)
通过基类引用调用基类和派生类中的同名虚函数时:

  • 若该引用引用的是一个基类的对象,那么被调 用是基类的虚函数;
  • 若该引用引用的是一个派生类的对象,那么被 调用的是派生类的虚函数。

这种机制也叫做“多态”。
举栗子:

class CBase {
public:
	virtual void SomeVirtualFunction() { }
};

class CDerived:public CBase {
public :
	virtual void SomeVirtualFunction() { }
};

int main() {
	CDerived ODerived;
	CBase & r = ODerived;
	r.SomeVirtualFunction(); //调用哪个虚函数取决于r引用哪种类型的对象
	return 0;
}
posted @ 2019-12-05 15:29  江南又一春  阅读(315)  评论(0编辑  收藏  举报