多态基本概念
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;
}