本文已参与「新人创作礼」活动,一起开启掘金创作之路。
游戏开发之C++多继承及虚继承(C++基础)
1.多继承的概念
概念:一个类(派生类)同时继承多个父类(基类)。 不推荐使用,因为多继承会带来非常严重的二义性(例如:继承的两个父类有同名的成员函数)。
多继承之菱形继承实例:
class F
{
public:
int f;
void PrintF()
{
std::cout << __FUNCTION__ << " " << __LINE__ << ":" << f << std::endl;
}
};
class A :public F
{
public:
int a;
void Print()
{
f = 1;
std::cout << __FUNCTION__ << " " << __LINE__ << ":" << f << std::endl;
}
};
class B :public F
{
public:
int b;
void Print()
{
f = 2;
std::cout << __FUNCTION__ << " " << __LINE__ << ":" << f << std::endl;
}
};
//派生类C继承基类A、B
class C : public A, public B
{
public:
int c;
};
int main()
{
C c;
sizeof(C);//20,A和B类的父类均为F类,F类有两份。
//c.Print();错误,编译器无法清楚具体调用的是A、B、C三个类中哪个类的Print
c.A::Print();
c.B::Print();
c.A::f = 1;
c.B::f = 2;
c.A::PrintF();//1
c.B::PrintF();//2
return 0;
}
2.虚继承
虚继承用于解决菱形继承中公共基类有两份的问题。 虚继承会在每个定义虚继承的类中生成一个虚类指针(可通过sizeof验证)。 当定义为虚继承时,公共基类只有一份。 语法: 语法:类 变量名:virtual 访问权限 父类变量名1,virtual 访问权限 父类变量名2,...{成员列表}
实例:
class F
{
public:
int f;
void PrintF()
{
std::cout << __FUNCTION__ << " " << __LINE__ << ":" << f << std::endl;
}
};
//A类虚继承F类
class A :virtual public F
{
public:
int a;
void Print()
{
f = 1;
std::cout << __FUNCTION__ << " " << __LINE__ << ":" << f << std::endl;
}
};
//B类虚继承F类
class B :virtual public F
{
public:
int b;
void Print()
{
f = 2;
std::cout << __FUNCTION__ << " " << __LINE__ << ":" << f << std::endl;
}
};
class C : public A, public B
{
public:
int c;
};
int main()
{
//定义虚继承
C c;
//4(C类)+8(B类)+8(A类)+4(F类) = 24个字节。
sizeof(C);//24,A和B类中编译器都添加了一个虚类指针,F类只有一份。
//由于F类只有一份公共内存,所以f最终的结果是2。
c.A::f = 1;
c.B::f = 2;
c.A::PrintF();//2
c.B::PrintF();//2
return 0;
}
版本声明:本文为CSDN博主[ufgnix0802]的原创文章。
原文链接:(blog.csdn.net/qq135595696…)