update:6/6,面向对象程序设计
虚函数
在一个基类中声明一个函数为virtual类型,即virtual void Run();那么这个函数就是虚函数,
作用:实现多态,父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。
我这里是
class vehicle{
public:
int MaxSpeed;
int Weight;
virtual void Run(){
cout<<"NMSL1\n";
};
void Stop(){};
};
class bicycle:public vehicle{
public:
int Height;
void Run(){
cout<<"NMSL2\n";
};
};
class motorcar:public vehicle{
public:
int SeatNum;
void Run(){
cout<<"NMSL3\n";
};
};
然后通过父类指针指向子类实例
vehicle vc,*VC;
bicycle bc;
motorcar mc1;
VC=&vc;
VC->Run();
VC=&bc;
VC->Run();
VC=&mc1;
VC->Run();
结果是
NMSL1
NMSL2
NMSL3
如果之前我不声明Run为虚函数,那么结果是:
NMSL1
NMSL1
NMSL1
虚函数最关键的特点是“动态联编”,它可以在运行时判断指针指向的对象,并自动调用相应的函数。
虚继承
上面说到,虚函数是在基类中声明,而虚继承不一样,虚继承是在一代子类中声明继承方式为虚继承。
class bicycle:virtual public vehicle{
public:
int Height;
void Run(){
cout<<"NMSL2\n";
};
};
class motorcar:virtual public vehicle{
public:
int SeatNum;
void Run(){
cout<<"NMSL3\n";
};
};
虚继承的作用是:
虚继承 是面向对象编程中的一种技术,是指一个指定的基类,在继承体系结构中,将其成员数据实例共享给也从这个基类型直接或间接派生的其它类。
虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。
类D继承自类B1、B2,而类B1、B2都继承自类A,加入不说明B1\B2继承A的方式,会导致D调用A的函数时出现二义性,不知道是B1继承的A还是B2继承的A,这时候需要引入虚继承。