第六周 多态
1.虚函数和多态的基本概念
2.多态实例:魔法门之英雄无敌
3.更多多态程序实例
4.多态的实现原理
5.虚析构函数、纯虚函数和抽象类
1.虚函数和多态的基本概念
虚函数
在类的定义中,前面有 virtual 关键字的成员函数就是虚函数。
class base {
virtual int get() ;
};
int base::get(){ }
virtual 关键字只用在类定义里的函数声明中,写函数体时不用。
构造函数和静态成员函数不能是虚函数。
虚函数和其他函数的区别:虚函数可以参与多态,其他函数不能。
多态的变现形式 一
派生类的指针可以赋给基类指针(赋值兼容规则)。
通过基类指针调用基类和派生类中的同名虚函数时:
(1)若该指针指向一个基类的对象,那么被调用是基类的虚函数;
(2)若该指针指向一个派生类的对象,那么被调用的是派生类的虚函数。
这种机制就叫做“多态”。
class CBase {
public:
virtual void SomeVirtualFunction() { }
};
class CDerived:public CBase {
public :
virtual void SomeVirtualFunction() { }
};
int main() {
CDerived ODerived;
CBase * p = & ODerived;//p指向派生类对象
p -> SomeVirtualFunction(); //调用哪个虚函数取决于p指向哪种类型的对象,这里调用的是派生类的虚函数
return 0;
}
多态的表现形式 二
派生类的对象可以赋给基类引用
通过基类引用调用基类和派生类中的同名虚函数时:
(1)若该引用引用的是一个基类的对象,那么被调用是基类的虚函数;
(2)若该引用引用的是一个派生类的对象,那么被调用的是派生类的虚函数。
这种机制也叫做“多态”。
class CBase {
public:
virtual void SomeVirtualFunction() { }
};
class CDerived:public CBase {
public :
virtual void SomeVirtualFunction() { }
};
int main() {
CDerived ODerived;
CBase & r = ODerived;//r引用的是派生类对象
r.SomeVirtualFunction(); //调用哪个虚函数取决于r引用哪种类型的对象,这里调用的是派生类的虚函数
return 0;
}
多态的简单示例
class A {
public :
virtual void Print( )
{ cout << "A::Print"<<endl ; }
};
class B: public A {
public :
virtual void Print( ) { cout << "B::Print" <<endl; }
};
class D: public A {
public:
virtual void Print( ) { cout << "D::Print" << endl ; }
};
class E: public B {
virtual void Print( ) { cout << "E::Print" << endl ; }
};
int main() {
A a; B b; E e; D d;
A * pa = &a; B * pb = &b;
D * pd = &d ; E * pe = &e;
pa->Print();// a.Print()被调用,输出:A::Print
pa = pb;
pa -> Print();//b.Print()被调用,输出:B::Print
pa = pd;
pa -> Print();//d. Print ()被调用,输出:D::Print
pa = pe;
pa -> Print();//e.Print () 被调用,输出:E::Print
return 0;
}
多态的作用
在面向对象的程序设计中使用多态,能够增强程序的可扩充性,即程序需要修改或增加功能的时候,需要改动和增加的代码较少。