本文已参与「新人创作礼」活动,一起开启掘金创作之路。
游戏开发之C++继承与派生(包含访问控制)(C++基础)
1.继承与派生
- 继承是站在子类的角度上来说的,派生是站在父类的角度来说的。
- 继承是复用父类的功能,实现代码重用。
- 1.继承具有传递性;
- 2.继承不具有对称性;
- 3.基类是对派生类的抽象,派生类是对基类的具体化。
继承的声明语法: class 派生类名:权限描述符 继承父类1,权限描述符 继承父类2,...{成员列表}
TIPS:父类(基类)名必须是已定义的变量名。
//基类A
class A
{
public:
A()
{
std::cout << __FUNCTION__ << " " << __LINE__ << std::endl;
}
void PrintA()
{
std::cout << __FUNCTION__ << " " << __LINE__ << std::endl;
}
};
//派生类B
//继承声明语法
class B :public A
{
public:
void PrintB()
{
std::cout << __FUNCTION__ << " " << __LINE__ << std::endl;
}
};
int main()
{
//调用方式
B b;
b.PrintA();
b.PrintB();
return 0;
}
2.访问控制
主要体现在:
- 派生类成员对基类成员的访问权限。
- 通过派生类对象对基类成员的访问权限。
2.1 公有继承
公有继承,继承之后对父类的访问权限不变。 派生类内部: ①基类的public和protected成员:访问属性在派生类中保持不变,即在派生类中也是public和protected权限。 ②基类的private成员:不可直接访问,但其仍然从基类被继承到派生类中,需要添加为友元类才可直接访问。 ③派生类的成员函数可以直接访问基类的public和protected成员,但不能直接访问基类的private成员。 派生类对象: 只能访问基类public成员。
2.2 保护继承
保护继承:继承之后对父类的访问权限全部修改为保护级别,私有变量除外。 派生类内部: ①基类的public和protected成员:都已protected身份出现在派生类中。 ②基类的private成员:不可直接访问,但其仍然从基类被继承到派生类中,需要添加为友元类才可直接访问。 ③派生类的成员函数可以直接访问基类的public和protected成员,但不能直接访问基类的private成员。 派生类对象: 通过派生类对象,不可访问从基类继承的任意成员。
2.3 私有继承
私有继承:继承之后类外不允许访问,所有成员修改为私有成员。 派生类内部: ①基类的public和protected成员:都以private身份出现在派生类中。 ②基类的private成员:不能直接访问。 ③派生类的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。 派生类对象: 通过派生类对象,不可以访问基类继承的任意成员。
2.4 实例
class A
{
public:
int a;
//类外不允许访问,但是继承类可以访问(要求:继承权限必须是公有权限或保护权限)
protected:
int b;
private:
int c;
};
//公有继承,继承之后对父类的访问权限不变。
class B :public A
{
public:
B()
{
a = 1;//公有权限
b = 2;//保护权限
//c = 3; 无法访问
}
};
//保护继承,继承之后对父类的访问权限全部修改为保护级别,私有变量除外。
class C :protected A
{
public:
C()
{
a = 1;//保护权限
b = 2;//保护权限
//c = 3;无法访问
}
};
//私有继承,继承之后类外不允许访问,所有成员修改为私有成员。
class D :private A
{
public:
D()
{
a = 1;//私有权限
b = 2;//私有权限
}
};
int main()
{
B b;
//基类的protected和private无法访问,只能访问public权限的成员变量
b.a = 1;
//基类的所有成员变量均不可直接访问
C c;
//基类的所有成员变量均不能直接访问
D d;
//说明基类的private也被继承下来,只是无法直接访问
sizeof(b);//12
sizeof(c);//12
sizeof(d);//12
return 0;
}
2.5 总结
即不管是共有、保护、私有继承,派生类内部依然遵照基类的规则。而派生类对象则会发生改变。 版本声明:本文为CSDN博主[ufgnix0802]的原创文章。
原文链接:(blog.csdn.net/qq135595696…)