首页 > 其他分享 >2.6继承

2.6继承

时间:2024-03-19 11:56:12浏览次数:19  
标签:继承 子类 成员 同名 访问 父类 2.6

继承

image

我们发现,定义这些类时,下级别的成员除了拥有上一级的共性,还有自己的特性,这个时候我们就可以考虑利用继承的技术,减少重复代码

1、继承的基本语法

例如:
我们看到很多网站中,都有公共的头部,公共的底部,甚至公共的左侧列表,只有中心内容不同。

总结:
继承的好处:可以减少重复的代码

class A : public B;
A类称为子类 或 派生类
B类称为父类 或 基类

派生类中的成员,包含两大部分:
一类是从基类继承过来的,一类是自己增加的成员。
从基类继承过来的表现其共性,而新增的成员体现了其个性。

2、继承方式

继承的语法:class 子类 : 继承方式 父类
如:
class Son : public Base;
class Son : private Base;

继承方式一共有三种:
1.公共继承
2.保护继承
3.私有继承
image

3、继承中的对象模型

问题:从父类继承过来的成员,哪些属于子类对象中?

class Base
{
public:
	int m_A;
protected:
	int m_B;
private:
	int m_C; //私有成员只是被隐藏了,但是还是会继承下去
};

//公共继承
class Son :public Base
{
public:
	int m_D;
};

void test01()
{
	//输出会是16  继承的m_A,m_b,m_C,和自己的m_D 4个int类型
	//父类中的所有非静态成员属性都会被子类继承下去
	//父类中私有成员属性 是被编译器给隐藏了,因此是访问不到,但是确实被继承下去了
	cout << "sizeof Son = " << sizeof(Son) << endl;
}

int main() {
	test01();
	return 0;
}

4、继承中构造和析构顺序

子类继承父类后,当创建子类对象,也会调用父类的构造函数。

问题:父类和子类的构造和析构函数顺序是谁先谁后?
构造顺序:先构造父类,再构造子类
析构顺序:先析构子类,再析构父类

5、继承同名成员处理方式

问题:当子类与父类出现同名的成员,如何通过子类对象,访问到子类或父类中同名的数据或函数呢?

1.访问子类同名成员,直接访问即可
s.m_A
s.func();
2.访问父类同名成员,需要加作用域
s.Base::m_A
s.Base::func();

3.如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中所有同名成员函数,包括父类中重载的成员函数。
子类不能直接访问,需要加作用域!

6、继承同名静态成员处理方式

问题:继承中同名的静态成员在子类对象上如何进行访问?

静态成员和非静态成员出现同名,处理方式一直
1.访问子类同名成员,直接访问即可
2.访问父类同名成员,需要加作用域

1.通过对象访问
s.m_A
s.Base::m_A

2.通过类名访问
son::m_A
Son::Base::m_A
第一个::代表通过类名方式访问, 第二个::代表访问父类作用域下的m_A

总结

同名静态成员处理方式和非静态处理方式一样,只不过有两种访问方式

7、多继承语法

C++允许一个类继承多个类
语法:class 子类 : 继承方式 父类1, 继承方式 父类2 ...

多继承可能会引发父类中有同名成员出现,需要加作用域区分

如:父类1中存在属性A,而父类2中也存在属性A,这时候就需要通过加作用域来区分。

C++实际开发中不建议用多继承

总结:多继承中如果父类中出现了同名情况,子类使用时候要加作用域

8、菱形继承

(挖坑,暂时没听懂!)
概念:
两个派生继承同一个基类
又有某个类同时继承着两个派生类
这种继承被称为菱形继承,或者钻石继承
典型案例:
image

菱形继承为题:
1.羊继承了动物的数据,驼同样继承了动物的数据,当草泥马使用数据时,就会产生二义性。
2.草泥马继承自动物的数据继承了两份,其实我们应该清楚,这份数据我们只需要一份就可以。

解决方式:虚继承
在继承之前加上关键字virtual变为虚继承
如:

class Sheep : virtual public Animal {};
class Tuo   : virtual public Animal {};

总结:
1.菱形继承带来的主要问题是子类继承两份相同的数据,导致资源浪费以及毫无意义。
2.利用虚继承可以解决菱形继承问题。

标签:继承,子类,成员,同名,访问,父类,2.6
From: https://www.cnblogs.com/H43724334/p/18081283

相关文章

  • JAVA面向对象高级:继承:权限修饰符(继承注意事项) 单继承 Object类 方法重写
    权限修饰符(共四个):publilcprivateprotected缺省   单继承:   Object类:所有类的祖宗类。类均继承了Object类  方法重写     方法重写在开发中的应用场景:子类重写Object类中toString方法  ......
  • JAVA 方法(方法的重载、方法的继承)
    目录方法导入参数可以有多个返回多个参数方法的重载 方法的继承方法一个方法分为访问修饰符,关键字,返回类型,方法名,以及导入参数示例publicstaticvoidmain(String[]args){}解释:其中public是访问修饰符,static是关键字,void是返回类型,main是方法名,args是导入参......
  • Python面向对象编程:合集篇(类、对象、封装、继承和多态)
    Python语言设计之初,就是为了面向对象。所以Python的面向对象更加易于理解。如果你以前学过Java、C++你大概就懂得什么是面向对象,但如果你是第一门编程语言就选择Python,那么也不要害怕。这篇文章,我们将会尽量详细的讲解,把Python面向对象编程的知识讲清楚。接下来我们先来简单的......
  • C++ 继承( inheritance)
    目录一、简介:二、继承1.基础介绍:1.1、1.2继承格式介绍1.2.11.2.22.基类和派生类对象赋值转换3.继承中的作用域4.派生类的默认成员函数5.友元与继承6.继承与静态成员变量7.复杂的菱形继承及菱形虚拟继承8.总结:一、简介:面向对象编程(Object-OrientedProgramm......
  • 16.【CPP】详解继承
    继承方式如图注意点1.基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它2.基类private成员在派生类中是不能被访问,如果基类成员不......
  • java核心技术卷1 第五章:继承
    学习重要的是出,而不是入,此前一直埋头向前学,忽视了复习的重要性。写一个博客作为自己的学习笔记,也可作为以后查漏补缺的资料,温故而知新。类,超类和子类一个继承另一个类,父类也称为超类,基类。"超类"中的超来自于集合理论,指的是父类,与之后的super关键字对应java中,类的继承默认为pu......
  • C++类模板与继承详解
    C++模板类模板和类模板之间、类模板和类之间可以互相继承。它们之间的派生关系有以下四种情况。1.类模板从类模板派生示例程序:template <class T1, class T2>class A{    Tl v1; T2 v2;};template <class T1, class T2>class B : public A <T2,......
  • 继承
       当子父类中出现重名变量的时候,不使用关键字的话遵循就近原则    多继承可能导致继承的方法冲突(来自不同父类同样的名字的方法,执行内容不一样)多层继承能行是因为方法重写机制确保方法名的唯一,不会导致冲突  子类继承了父类的全部属性和方法,但是不......
  • 为什么Java不支持多继承
    1、典型回答在Java语言中,不支持多继承的主要原因是为了简化语言设计和避免潜在的问题(如菱形继承)以及避免多重继承的层次膨胀,同时又因为在实际工作中,确实很少用到多继承,所以在Java语言中,并不支持多继承。而且,虽然Java中不支持多继承,但也给了一些功能上的替代方案,比如实现多......
  • C++超详细知识点(四):类的继承和派生
    目录标题:类的继承和派生1.公有继承2.保护继承3.私有继承4.问题:基类的私有成员在派生类中不可访问,那么怎么才能访问其父类(基类)的私有成员呢?(1)使用公有/保护成员函数。(2)使用友元函数或友元类。标题:类的继承和派生  类的继承和派生是一种机制,允许你创建一个新的......