1.虚函数和纯虚函数(C,C++) 定义方式
虚函数:virtual void fun();可在父类中直接实现和定义父类的对象,也可在子类中重写父类中定义的虚函数。
纯虚函数:virtual void fun()=0;只能在父类(虚基类)中定义,继承的子类必须实现父类中的纯虚函数的功能。
执行方式:执行过程是动态联编的,即在程序运行时进行关联或束定。且动态联编只能通过指针和引用方式来操作虚函数。
共同点:一般是通过定义基类的指针和引用,然后将该指针或引用指向不同的的子类对象,在调用对应的虚函数。
2.多态的定义
多态就是通过类的继承,使得同一个函数可以根据调用它的对象的类型的不同做出不同的响应。定义的父类对象的引用或指针只能访问子类从父类继承来的方法。
在C++中通过虚函数来实现的,在java中,对象变量是多态的,没有虚函数的概念。
如下Java中实现多态的例子:
class Vehicle
{
public:
void drive();
};
class Car extends Vehicle
{//Java中只有共有继承,用extends表示
public:
void drive(){
cout<<"启动轿车"<<endl;
}
};
class Truck extends Vehicle
{
public:
void drive(){
cout<<"启动卡车"<<endl;
}
};
Vehicle v1;//定义基类对象v1
v1=new Car();
v1.drive();//输出“启动轿车”
v1=new Truck();
v1.drive();//输出“启动卡车”
在C++实现对态:
class Vehicle
{
public:
virtual void drive()=0;
};
class Car:public Vehicle
{//Java中只有共有继承,用extends表示
public:
void drive(){
cout<<"启动轿车"<<endl;
}
};
class Truck:public Vehicle
{
public:
void drive(){
cout<<"启动卡车"<<endl;
}
};
Vehicle *v1;//定义基类指针v1
Car c;
Truck t;
v1=&c;
v1->drive();//输出“启动轿车”
v1=&t;
v1->drive();//输出“启动卡车”
3.子类和父类的转换
子类对象转父类:可直接利用多态的性质进行转换。
父类转子类:一般先使用instancesof运算符判断能否进行转换(是否有继承关系),然后用(子类type)父类对象的方法进行强制类型转换。
instancesof运算符的使用:A instancesof B,A是类B类型的对象或类B的父类。