您的位置:首页 > 编程语言 > C语言/C++

C++虚继承

2015-05-15 16:46 169 查看
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”

好了,希望能对您有所帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息