拖拽网站怎么做的,做网站要哪些人员,0基础wordpress,视频拍摄流程文章目录 #x1f4da;继承的概念和语法#x1f4da;派生类生成过程#x1f4da;继承权限和继承方式#x1f407;公有继承#x1f407;私有继承#x1f407;保护继承 #x1f4da;类型转换规则#x1f4da;派生类构造函数和析构函数#x1f4da;继承中的静态成员特性继承的概念和语法派生类生成过程继承权限和继承方式公有继承私有继承保护继承 类型转换规则派生类构造函数和析构函数继承中的静态成员特性虚继承和虚基类 继承的概念和语法
⭐️概念 类的继承是新的类从已有类那里得到已有的特性。类的派生从已有类产生新类的过程。原有的类称为基类或父类产生的新类称为派生类或子类。直接参与派生出某类的基类称为直接基类基类的基类甚至更高层的基类称为间接基类。 ⭐️语法 class 派生类名:继承方式 基类名{undefined 派生类新增加的成员}; 若是多继承则有class 派生类名继承方式1 基类名1继承方式2 基类名2…每一个“继承方式”只用于限制对紧随其后之基类的继承。 基类是已有类的名称。派生类是继承原有类的特性生成的新类的名称。继承方式包括 public公有的、private私有的和 protected受保护的此项是可选的如果不写那么默认为 private。
派生类生成过程
⭐️吸收基类成员吸收基类成员之后派生类实际上就包含了它的全部基类中除构造和析构函数之外的所有成员。⭐️改造基类成员 访问控制问题由定义时的继承方式控制。覆盖隐藏 如果派生类中的成员包括成员变量和成员函数和基类中的成员重名那么就会遮蔽从基类继承过来的成员。所谓遮蔽就是在派生类中使用该成员包括在定义派生类时使用也包括通过派生类对象访问该成员时实际上使用的是派生类新增的成员而不是从基类继承来的。基类成员函数和派生类成员函数不构成重载 基类成员和派生类成员的名字一样时会造成遮蔽这句话对于成员变量很好理解。对于成员函数不管函数的参数如何只要名字一样就会造成遮蔽。换句话说基类成员函数和派生类成员函数不会构成重载如果派生类有同名函数那么就会遮蔽基类中的所有同名函数不管它们的参数是否一样。 如果在派生类中需要且仅需要重写其中一个重载函数该如何操作 通过using在派生类中为父类函数成员提供声明 即添加 “ using Base::print; ”通过基类指针调用进阶办法把在派生类中需要重载的那个版本相应地在基类中声明为vitual ⭐️添加新的成员在定义时直接添加就好。
继承权限和继承方式
不同继承方式的影响主要体现在 派生类成员对基类成员的访问权限。通过派生类对象对基类成员的访问权限。
公有继承
基类的public和protected成员的访问属性在派生类中保持不变但基类的private成员不可直接访问。派生类中的成员函数可以直接访问基类中的public和protected成员但不能直接访问基类的private成员。通过派生类的对象只能访问基类的public成员。
私有继承
基类的public和protected成员都以private身份出现在派生类中但基类的private成员不可直接访问。派生类中的成员函数可以直接访问基类中的public和protected成员但不能直接访问基类的private成员。通过派生类的对象不能直接访问基类中的任何成员。
保护继承
基类的public和protected成员都以protected身份出现在派生类中但基类的private成员不可直接访问。派生类中的成员函数可以直接访问基类中的public和protected成员但不能直接访问基类的private成员。通过派生类的对象不能直接访问基类中的任何成员。特点和作用 对建立其所在类对象的模块来说它与 private 成员的性质相同。这意味着只有在类内部或者友元函数中才能访问保护继承的成员。这样可以实现数据隐藏防止外部模块直接访问变量或函数。对于其派生类来说它与 public 成员的性质相同。这意味着派生类可以直接访问和使用保护继承的成员但是对外部模块来说是不可见的。这样可以方便继承派生类可以重用保护继承的成员实现代码的重用。既实现了数据隐藏又方便继承实现代码重用。 ⭐️private, public, protected 三类访问标号的访问范围
private属性 只能由①该类中的函数、②其友元函数访问。该类的对象不能访问。 protected属性 可以被①该类中的函数、②子类的函数、以及③其友元函数访问。该类的对象不能访问。 public属性 可以被①该类中的函数、②子类的函数、以及③其友元函数访问。该类的对象可以访问。 无论是哪种继承方式基类的私有成员在派生类中都是不可被访问的。只能通过基类的成员函数访问基类的私有数据成员。 如果在一个派生类中要访问基类中的私有成员可以将这个派生类声明为基类的友元。
类型转换规则
一个公有派生类的对象在使用上可以被当作基类的对象反之则禁止。具体表现在 派生类的对象可以隐含转换为基类对象。派生类的对象可以初始化基类的引用。派生类的指针可以隐含转换为基类的指针。 通过基类对象名、指针只能使用从基类继承的成员。
派生类构造函数和析构函数
基类的成员函数可以被继承可以通过派生类的对象访问类的构造函数不能被继承。在派生类的构造函数中调用基类的构造函数。Student::Student(char *name, int age, float score): People(小明, 16), m_score(score){ }派生类构造函数中只能调用直接基类的构造函数不能调用间接基类的。 当基类中没有显式定义构造函数或定义了无参构造函数时派生类构造函数的初始化表可以省略对基类构造函数的调用而采用隐含调用。当基类的构造函数使用一个或多个参数时派生类必须定义构造函数提供将参数传递给基类构造函数的途径。定义构造函数时需要对本类中新增成员进行初始化对继承来的基类成员的初始化自动调用基类构造函数完成。这时派生类构造函数的函数体可能为空仅起到参数传递作用。如果在基类中既定义了无参构造函数又定义了带参构造函数则在定义派生类构造函数时既可以包含基类构造函数和参数也可以不包含基类构造函数。 和构造函数类似析构函数也不能被继承。不用程序员显示调用、编译器负责⚠️执行顺序 基类构造函数的调用顺序是按照派生类定义时的顺序。内嵌对象的构造函数调用顺序是按照成员在类中声明的顺序。先执行基类构造函数再执行内嵌对象的构造函数。而销毁派生类对象时析构函数的执行顺序和继承顺序相反即先执行派生类析构函数再执行基类析构函数。
继承中的静态成员特性
均被继承到派生类中。重新定义静态成员函数基类中的其他函数会被隐藏。改变基类中的一个函数特征返回值、参数个数则使用该函数名的基类版本均会被隐藏。
虚继承和虚基类 多继承Multiple Inheritance是指从多个直接基类中产生派生类的能力多继承的派生类继承了所有父类的成员。容易产生问题命名冲突。 虚继承Virtual Inheritance为了解决多继承时的命名冲突和冗余数据问题C 提出了虚继承使得在派生类中只保留一份间接基类的成员。在继承方式前面加上virtual关键字就是虚继承。 形式举例 间接基类Aclass A{protected: int m_a;};直接基类Bclass B: virtual public A{ //虚继承protected: int m_b;}; 虚继承的目的让某个类做出声明承诺愿意共享它的基类。其中这个被共享的基类就称为虚基类Virtual Base Class虚继承时的构造函数 虚继承中虚基类是由最终的派生类初始化的换句话说最终派生类的构造函数必须要调用虚基类的构造函数。对最终的派生类来说虚基类是间接基类而不是直接基类。这跟普通继承不同在普通继承中派生类构造函数中只能调用直接基类的构造函数不能调用间接基类的。 关于虚继承的说明 当使用虚继承时虚基类是共享的无论被继承多少次对象内存中只有一个虚基类子对象。其初始化也只能由一个类初始化一次。C标准中要求每次继承之类中均需要写初始化语句但虚基类的初始化是由最后的子类完成其他初始化子类均不会调用。