一、基础知识
1、多态性的基本概念
多态性是指一个名字多种语义,或界面相同多种实现
重载函数是多态性的一种简单形式
虚函数允许函数调用与函数体的联系在运行时才进行,称为动态联编
2动态联编
(1)虚函数和基类指针
写有关键字virtual的成员函数称为虚函数,实现运行多态的关键是要说明虚函数,另外必须用基类指针调用派生类的不同实现版本。
注意:
一个虚函数,在派生类层界面相同的重载函数都保持虚特性
虚函数必须是类的成员函数
不能将友元说明为虚函数,但虚函数可以是另一个类的友元
析构函数可以是虚函数,但构造函数不行
(2)虚函数的重载特性
(3)、虚析构函数
构造函数不能是虚函数。建立一个派生类的对象时,必须从类的层次的根开始,沿着继承路径逐个调用基类的构造函数
析构函数可以是虚的。虚析构函数用于指引delete运算符正确析构动态对象
(4)注意:
必须首先在基类中定义虚函数。
派生类对基类中声明虚函数重新定义时,关键字virtual可以不写。
一般通过基类指针访问虚函数时才能体现多态性。
一个虚函数无论被继承多少次,保持其虚函数特性。
虚函数必须是其所在类的成员函数,而不能是友元函数,也不能是静态函数。
构造函数、内联成员函数、静态成员函数不能是虚函数。
3、纯虚函数和抽象类
不对虚函数做定义,而把它声明为纯虚函数,它的实现留给该基类的派生类去做,这是纯虚函数的作用
纯虚函数是一个在基类中说明的虚函数,在基类中没有定义, 要求任何派生类都定义自己的版本,纯虚函数为各派生类提供一个公共界面
纯虚函数说明形式:
virtual 类型 函数名(参数表)= 0 ;
-
-
using namespace std ;
-
class Number
-
{ public : Number ( int i) { val = i ; }
-
virtual void Show() = 0 ;
-
protected: int val ;
-
};
-
class Hex_type : public Number
-
{ public: Hex_type( int i) : Number(i) { }
-
void Show() { cout << "Hexadecimal:" << hex << val << endl ; }
-
};
-
class Dec_type : public Number
-
{ public: Dec_type( int i) : Number(i) { }
-
void Show() { cout << "Decimal: " << dec << val << endl ; }
-
};
-
class Oct_type : public Number
-
{ public: Oct_type( int i) : Number(i) { }
-
void Show() { cout << "Octal: " << oct << val << endl ; }
-
};
-
void fun( Number & n ) // 抽象类的引用参数
-
{ n.Show() ; }
-
int main()
-
{ Dec_type n1(50);
-
fun(n1); // Dec_type::Show()
-
Hex_type n2(50);
-
fun(n2); // Hex_type::Show()
-
Oct_type n3(50);
-
fun(n3); // Oct_type::Show()
-
}
在多态使用时,如果多态中,子父类出现同名变量、同名静态方法时,调用时只看引用。同名静态函数只看实体。
有了多态使得对象的调用变得简单,不用再每个对象每个对象的去调用,而是一次性调用所有对象去执行。