Hello,C++(4)继承

Hello,C++(4)继承

继承

类之间的关系:包含、使用、继承

 继承重要说明

1)子类继承了父类的全部成员变量和成员方法(除了构造和析构之外的成员方法)

2)子类可以拥有父类没有的方法和属性

3)父类若有带参数的函数,可以将子类作为参数传递进去)

4)子类就是一种特殊的父类,子类对象可以当作父类对象使用

(儿子至少比父亲强:成员变量和方法至少比父亲多;儿子可以调用父亲的带参数函数;儿子也可以成为父亲)

子类对外访问属性表

Hello,C++(4)继承

“三看”原则判断能否访问(从外到内)

C++中的继承方式(public、private、protected)会影响子类的对外访问属性

判断某一句话,能否被访问

         1)看调用语句,这句话写在子类的内部、外部

         2)看子类如何从父类继承(public、private、protected)  

         3)看父类中的访问级别(public、private、protected)

(protect是为家族使用)

(在项目开发中,一般用public)

继承中的构造和析构

  • 类型兼容性原则

类型兼容规则是指在需要基类对象的任何地方,都可以使用公有子类的对象来替代。通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有成员。这样,公有派生类实际就具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。类型兼容规则中所指的替代包括以下情况:

子类对象可以当作父类对象使用

子类对象可以直接赋值给父类对象

子类对象可以直接初始化父类对象

父类指针可以直接指向子类对象

父类引用可以直接引用子类对象

在替代之后,派生类对象就可以作为基类的对象使用,但是只能使用从基类继承的成员。

类型兼容规则是多态性的重要基础之一。

总结:子类就是特殊的父类 (base *p = &child;)

 

#include <cstdlib> #include <iostream>
using namespace std; /* 子类对象可以当作父类对象使用 子类对象可以直接赋值给父类对象 子类对象可以直接初始化父类对象 父类指针可以直接指向子类对象 父类引用可以直接引用子类对象 */

//子类就是特殊的父类

class Parent03 { protected: const char* name; public: Parent03() { name = "Parent03"; } void print() { cout<<"Name: "<<name<<endl; } }; class Child03 : public Parent03 { protected: int i; public: Child03(int i) { this->name = "Child2"; this->i = i; } }; int main() { Child03 child03(1000); //分别定义父类对象 父类指针 父类引用 child Parent03 parent = child03; Parent03* pp = &child03; Parent03& rp = child03; parent.print(); pp->print(); rp.print(); system("pause"); return 0; }

 

问题:如何初始化父类成员?父类与子类的构造函数有什么关系

         在子类对象构造时,需要调用父类构造函数对其继承得来的成员进行初始化

         在子类对象析构时,需要调用父类析构函数对其继承得来的成员进行清理

 

 
  • 继承中的构造析构调用原则

1、子类对象在创建时会首先调用父类的构造函数

2、父类构造函数执行结束后,执行子类的构造函数

3、当父类的构造函数有参数时,需要在子类的初始化列表中显示调用

4、析构函数调用的先后顺序与构造函数相反

  • 继承与组合混搭情况下,构造和析构调用原则

         原则:    先构造父类,再构造成员变量、最后构造自己

                          先析构自己,在析构成员变量、最后析构父类

继承中的重名成员变量处理方法

1、当子类成员变量与父类成员变量同名时

2、子类依然从父类继承同名成员

3、在子类中通过作用域分辨符::进行同名成员区分(在派生类中使用基类的同名成员,显式地使用类名限定符

4、同名成员存储在内存中的不同位置

 

总结:同名成员变量和成员函数通过作用域分辨符进行区分

派生类中的static关键字

继承和static关键字在一起会产生什么现象哪?

理论知识

  • 基类定义的静态成员,将被所有派生类共享
  • 根据静态成员自身的访问特性和派生类的继承方式,在类层次体系中具有不同的访问性质 (遵守派生类的访问控制)
  •  派生类中访问静态成员,用以下形式显式说明:

                          类名 :: 成员

或通过对象访问    对象名 . 成员

静态数据成员的初始化必须显式地初始化在外面。这句话告诉编译器分配内存,否则无法继承。

总结:

1> static函数也遵守3个访问原则

2> static易犯错误(不但要初始化,更重要的显示的告诉编译器分配内存)

3> 构造函数默认为private

多继承的应用

多继承概念

  •   一个类有多个直接基类的继承关系称为多继承
  •   多继承声明语法

class  派生类名 : 访问控制  基类名1访问控制  基类名2 ,  … , 访问控制  基类名n

    {

         数据成员和成员函数声明

    };

  •   类 C 可以根据访问控制同时继承类 A 和类 B 的成员,并添加

     自己的成员

虚继承

  如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的名字进行访问时,可能产生二义性(用虚继承来解决)

总结:

  •   如果一个派生类从多个基类派生,而这些基类又有一个共同

     的基类,则在对该基类中声明的名字进行访问时,可能产生

     二义性

  •   如果在多条继承路径上有一个公共的基类,那么在继承路径的某处

     汇合点,这个公共基类就会在派生类的对象中产生多个基类子对象

  •   要使这个公共基类在派生类中只产生一个子对象,必须对这个基类

     声明为虚继承,使这个基类成为虚基类。

  •   虚继承声明使用关键字          virtual

 

继承总结

  • 继承是面向对象程序设计实现软件重用的重要方法。程序员可以在已有基类的基础上定义新的派生类。
  •  单继承的派生类只有一个基类。多继承的派生类有多个基类。
  •  派生类对基类成员的访问由继承方式和成员性质决定。
  •  创建派生类对象时,先调用基类构造函数初始化派生类中的基类成员。调用析构函数的次序和调用构造函数的次序相反。
  •  C++提供虚继承机制,防止类继承关系中成员访问的二义性。
  •  多继承提供了软件重用的强大功能,也增加了程序的复杂性。

 

转载于:https://www.cnblogs.com/juanjuanduang/p/10847014.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/100933.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号