在派生类中重新定义基类中的虚函数,是函数重载的另一种形式。
但虚函数与一般重载函数有区别,具体区别在于:
(1) 重载函数的调用是以所传递参数序列的差别作为调用不同函数的依据;而虚函数是根据对象的不同去调用不同类的虚函数。
(2) 重载函数在编译时表现出多态性,是静态联编;虚函数则在运行时表现出多态性,是动态联编。
**(3) 构造函数可以重载,析构函数不能重载;正好相反,构造函数不能定义为虚函数,
析构函数能定义为虚函数。
(4) 重载函数只要求函数有相同的函数名,并且重载函数是在相同作用域中定义的名字相同的不同函数;
而虚函数不仅要求函数名相同,而且要求函数的签名、返回类型也相同。
(5) 重载函数可以是成员函数或友元函数;而虚函数只能是非静态成员函数。
**
纯虚函数是一种特殊的虚函数,它是被标明为不具体实现的虚函数,从语法上讲,纯虚函数是在虚函数的后面加上“=0”,表示该虚函数无函数体,
这里的“=”并非赋值运算。
在一个类中如果虚函数不可能实现的太具体,则可以定义为纯虚函数。
纯虚函数为类的继承提供了连续的接口。
如果一个类中至少有一个纯虚函数,则这个类为抽象类。
如果派生类中没有再对基类中的纯虚函数进行重定义,则派生类也是抽象类。
不能定义抽象类的对象,但可以定义抽象类的指针和引用。
class ABC
{ public:
virtual void open()=0;
};
class X: public ABC
{ public:
virtual void open() { }
};
class Y: public ABC
{ };
ABC a1; //Error
X x1;// √ 因为x重定义了open() 函数
Y y1; //Error
虚函数的实现
void func(Shape &p) //形参为基类的引用
{ cout<<p.area()<<endl;}
int main()
{
Shape shape; //基类Figure对象
cout<<"Area of shape is ";
func(shape);
Circle c(3.0); //Circle派生类对象
cout<<"Area of circle is ";
func(c);
Rectangle rec(4.0,5.0);//Rectangle派生类对象
cout<<"Area of rectangle is ";
func(rec);
return 0;
}