虚继承和虚函数

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,这时候需要引入虚继承。

你可能感兴趣的:(C/C++)