C++虚继承

C++虚继承概念:
Virtual Inheritance 虚继承,解决从不同途径继承来的同名数据成员在内存中不同的数据拷贝导致的数据不一致问题,将共同的基类设置为虚基类。这时从不同路径继承来的数据成员在内存中只有一份拷贝,同名函数也只有一个映射。

语法:
Class C:virtual public A,virtual public B,…,virtual public n
{

}
执行顺序
1.执行虚基类的构造函数,多继承按照继承顺序构造
2.执行基类的构造函数,多继承按照继承顺序构造
3.执行成员对象的构造函数,多个成员对象按照申明顺序构造
4.执行派生类自己的构造函数

备注:执行析构的顺序与以上顺序相反
在执行虚基类构造函数的时候,如果是多重继承

虚继承与普通继承的区别
普通继承: C继承A 表明C “is a”即苹果就是水果
虚继承: C虚继承A 表明C “has a”即苹果是水果,但是苹果也可以是手机,C有了一个调用A的vptr

普通继承:

// Virtual_Exercise.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

class A
{
public:
    A();
    void print()
    {
        printf("This A class Aprintf\n");
    }
    ~A();

private:

};

A::A()
{
    printf("This is A Method\n");
}

A::~A()
{
    printf("This is A Destructor\n");
}

class B: public A
{
public:
    B();
    ~B();
    void A();
    void print()
    {
        printf("This B class Aprintf\n");
    }
private:

};

void B::A()
{
    printf("this is B's A Method\n");
}

B::B()
{
    printf("this is B Method\n");
}

B::~B()
{
    printf("This is B Destructor\n");
}

class C:public A,public B
{
public:
    C();
    ~C();

private:

};

C::C()
{
    printf("this is C Method\n");
}

C::~C()
{
    printf("this is C Destructor\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
    A a;
    a.print();
    B b;
    b.A();
    b.print();
    C c;
    //c.print();这种调用方法会出现错误
    c.B::print();
    c.A::print();

    getchar();
    return 0;
}

执行结果

虚继承:

// Virtual_Exercise.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

class A
{
public:
    A();
    void print()
    {
        printf("This A class Aprintf\n");
    }
    ~A();

private:

};

A::A()
{
    printf("This is A Method\n");
}

A::~A()
{
    printf("This is A Destructor\n");
}

class B: virtual public A
{
public:
    B();
    ~B();
    void A();
    void print()
    {
        printf("This B class Aprintf\n");
    }
private:

};

void B::A()
{
    printf("this is B's A Method\n");
}

B::B()
{
    printf("this is B Method\n");
}

B::~B()
{
    printf("This is B Destructor\n");
}

class C: virtual public A,virtual public B
{
public:
    C();
    ~C();

private:

};

C::C()
{
    printf("this is C Method\n");
}

C::~C()
{
    printf("this is C Destructor\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
    A a;
    a.print();
    B b;
    b.A();
    b.print();
    C c;
    c.print();//这样就可以调用了
    //c.B::print();
    //c.A::print();

    getchar();
    return 0;
}

这里写图片描述

看一下,调用方式及输出结果都有了变化^_^,细心的观众是不是发现虚继承的方法比普通继承的方法输出少了一次“This is A Method”

好了,希望能对您有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值