本文内容摘录自:从零开始学C++程序设计,仅作为入门使用
如果基类指针指向派生类的对象之后再调用其成员函数,结果仍然是调用到基类的成员函数。
可以通过下面的程序看出来:
#include <iostream>
using namespace std;
class vehicle {
public:
void start(){
cout<<"交通运输工具启动"<<endl;
}
void stop(){
cout<<"交通运输工具停止"<<endl;
}
};
class aircraft:public vehicle{
public:
void start(){
cout<<"飞行器启动"<<endl;
}
void stop(){
cout<<"飞行器停止"<<endl;
}
};
class car: public vehicle {
public:
void start(){
cout<<"汽车启动"<<endl;
}
void stop(){
cout<<"汽车停止"<<endl;
}
};
int main()
{
vehicle *ve = new vehicle();
aircraft af;
car cr;
ve->start();
ve->stop();
delete ve;
ve = ⁡
ve->start();
ve->stop();
ve= &cr;
ve->start();
ve->stop();
return 0;
}
执行之后的结果如下图所示:
ar和cr都是由vehicle派生的,虽然基类vehicle的指针指向了ar或cr,但是调用的函数仍然是指向相同存在于基类中的多态函数,并非我们所指定的存在于派生类中的函数。
如果将基类与派生类中的两个多态改以声明成为虚拟函数,则C++的编译程序会给予这两个虚拟函数不同的指针,因此程序执行时会按照所给予的指针不同来存取适当的函数。
一旦将函数声明为虚拟函数,就必须在派生类中重载该虚拟函数。另外,派生类虚拟函数的参数和返回值还必须与基类中声明的虚拟函数相同。
声明方式如下:
virtual 返回类型 函数名称(参数)
范例程序如下:
#include <iostream>
using namespace std;
class vehicle {
public:
virtual void start(){
cout<<"交通运输工具启动"<<endl;
}
virtual void stop(){
cout<<"交通运输工具停止"<<endl;
}
};
class aircraft:public vehicle{
public:
virtual void start(){
cout<<"飞行器启动"<<endl;
}
virtual void stop(){
cout<<"飞行器停止"<<endl;
}
};
class car: public vehicle {
public:
virtual void start(){
cout<<"汽车启动"<<endl;
}
virtual void stop(){
cout<<"汽车停止"<<endl;
}
};
int main()
{
vehicle *ve = new vehicle();
aircraft af;
car cr;
ve->start();
ve->stop();
delete ve;
ve = ⁡
ve->start();
ve->stop();
ve= &cr;
ve->start();
ve->stop();
return 0;
}
纯虚拟函数
在声明虚拟函数时,在表达式的尾端加入语句“=0”,而不加入任何定义该函数功能的语句,这种虚拟函数被称为“纯虚拟函数”。纯虚拟函数最主要的功能是在起始声明是并未加以定义该虚拟函数的本质而形成一种被保留的函数接口。
抽象基类
纯虚拟函数无法在单一类或是派生类中声明,只能存在于拥有继承关系的基类中,这种基类称为“抽象基类”。
当派生类继承了抽象基类之后,必须在派生类中“重新定义”及“实现”所继承的虚拟函数
#include <iostream>
using namespace std;
class vehicle {
public:
virtual void start() = 0;
virtual void stop() = 0;
};
class aircraft:public vehicle{
public:
virtual void start(){
cout<<"飞行器启动"<<endl;
}
virtual void stop(){
cout<<"飞行器停止"<<endl;
}
};
class car: public vehicle {
public:
virtual void start(){
cout<<"汽车启动"<<endl;
}
virtual void stop(){
cout<<"汽车停止"<<endl;
}
};
int main()
{
vehicle *ve ;
aircraft af;
car cr;
ve = ⁡
ve->start();
ve->stop();
ve= &cr;
ve->start();
ve->stop();
return 0;
}
程序运行的结果如下图所示: