编程知识 cdmana.com

205-C++继承与多态(继承的基本意义)

1、继承的意义

继承的本质:
a.代码的复用
b.

类和类之间的关系:

  • 组合: a part of… …一部分的关系
  • 继承: a kind of… …一种的关系

在这里插入图片描述
这样写非常麻烦的!

我们可以这样做:

  • 直接通过继承的方式
    在这里插入图片描述
    利用继承的方式来复用A中的成员变量。
class A
{
    
public:
	int ma;
protected:
	int mb;
private:
	int mc;
};
//继承 A称作基类/父类 B称作派生类/子类
class B :public A
{
    
public:
	int md;
protected:
	int me;
private:
	int mf;
};

B从A继承而来,A派生了B


继承了之后,发生了什么情况?

对于A来说,没有什么影响,用A定义一个对象a,还是12个字节。
在这里插入图片描述
我们来看B ,B定义了一个对象b,B是派生类,有2部分,第一部分是从基类继承而来的:ma,mb,mc,第二部分是派生类还有自己的md,me,mf
在这里插入图片描述
对象b的大小是24个字节。
如果我们现在在派生类中再写一个ma,大小就是28字节了。
在这里插入图片描述
现在派生类自己有一个ma,从基类继承而来的也有一个ma,这个名字编译器会不会报错?

  • 不会的。因为作用域不同。派生类从基类继承而来的成员相当于还附带了基类的作用域Base::,下面那个ma是派生类自己的成员,在自己的作用域下。

在这里插入图片描述
基类继承而来的ma是基类作用域下的,自己的ma是派生类作用域下的,作用域不同,派生类和基类的成员名字是可以一样的,不会产生冲突的。
在这里插入图片描述
学生是人的一种,这2个类就要设计成继承的关系了,学生从人继承。


派生类从基类继承而来的成员,派生类都可以访问吗?访问限定是什么?
在这里插入图片描述
B类有一个func函数,在这个func函数,对于从A继承来的ma,mb,mc,可不可以访问,访问限定是什么?
在这里插入图片描述
mc成员变量 占派生类对象的内存,但是在派生对象里,mc是无法访问的。

基类到派生类的成员的访问限定是不可能大于派生类的继承方式的
权限是public>protected>private
在这里插入图片描述
实际上,我们可以还有多个继承关系:
在这里插入图片描述
C把B的ma,mb,mc,md,me,mf都继承而来了。

在C里面, 继承而来的成员变量的访问限定是什么,主要是看它的直接基类B里面的访问限定是什么!!!

ma在B中是private的,C用public继承,ma在C中是不可见的!
在这里插入图片描述

2、总结

  • 1、外部只能访问对象public的成员,protected和private的成员无法直接访问
  • 2、在继承结构中,派生类从基类可以继承过来private的成员,但是派生类却无法直接访问
  • 3、protected和private的区别?
    在基类中定义的成员,想被派生类访问,但是不想被外部访问,那么在基类中,把相关成员定义成protected保护的;如果派生类和外部都不打算访问,那么在基类中,就把相关成员定义成private私有的。

3、默认的继承方式是什么?

要看派生类是用class定义的,还是struct定义的

  • class定义派生类,默认继承方式就是private私有的
  • struct定义派生类,默认继承方式就是public公有的
  • 和class,struct类中没有写访问限定 规则一致,class默认private,struct默认public!

版权声明
本文为[liufeng2023]所创,转载请带上原文链接,感谢
https://blog.csdn.net/Edward_LF/article/details/124765548

Scroll to Top