父类与子类间的继承关系

一、父类与子类

父类与子类的相互转换

1、派生类的对象可以赋给基类,反之不行
2、基类的指针可以指向派生类,反之不行
3、基类的引用可以初始化为派生类的对象,反之不行
4、派生类指针必须强制转换为基类指针后才可以指向基类
5、基类指针转换为派生类指针容易导致崩溃性错误
6、虚基类的引用或派生不能转换为派生类
class father{
  //
};
class son : public father{
  //
};
int main()
{
father f;
son s;
f = s;//正确
s = f;//错误 father *pf = new son;//正确
son *ps = new father;//错误 father &rf = s;//正确
father &rs = f;//错误
return ;
}

继承关系对基类成员的影响

  公有成员 保护成员 私有成员
公有继承 公有 保护 不可访问
保护继承 保护 保护 不可访问
私有继承 私有 私有 不可访问
成员函数 1 1 1
对象 1 0 0
子类 1 1 0
1:可以访问 0:不可访问
当所有成员都变成不可访问时,再往下派生就没有意义了。
 
 
二、子类的构造与析构
1、构造派生类对象时,先执行基类的构造函数,再执行子类的构造函数,析构反之
class father
{
public:
father(){cout<<"father construct"<<endl;}
~father(){cout<<"father delete"<<endl;}
};
class son : public father
{
public:
son(){cout<<"son construct"<<endl;}
~son(){cout<<"son delete"<<endl;}
};
int main()
{
son s;
return ;
}

输出:

father construct
son construct
son delete
father delete

2.如果是多重继承,基类的构造顺序按给定的顺序,析构反之

class father
{
public:
father(){cout<<"father construct"<<endl;}
~father(){cout<<"father delete"<<endl;}
};
class mother
{
public:
mother(){cout<<"mother construct"<<endl;}
~mother(){cout<<"mother delete"<<endl;}
};
class son : public father, public mother
{
public:
son(){cout<<"son construct"<<endl;}
~son(){cout<<"son delete"<<endl;}
};
int main()
{
son s;
return ;
}

输出:

father construct
mother construct
son construct
son delete
mother delete
father delete

3.利用基类的构造函数构造子类,效率更高

class father
{
int x;
public:
father(int a):x(a){cout<<"father construct:"<<x<<endl;}
};
class son : public father
{
int y;
public:
son(int a, int b):father(a), y(b){cout<<"son construct:"<<y<<endl;}
};
int main()
{
son s(, );
return ;
}

输出:

father construct:
son construct:

三、多重继承

1.多重继续的二义性,根本原因是

假如A有Test(),则B和C都有Test(),于是D产生了二义性

class A
{
public:
void Test(){cout<<"A"<<endl;}
};
class B
{
public:
void Test(){cout<<"B"<<endl;}
};
class C : public A, public B
{
};
int main()
{
C c;
c.Test(); //错误
c.A::Test(); //正确,输出:A
c.B::Test(); //正确,输出:B
return ;
}

2.编译器通常都是从离自己最近的目录树向上搜索的

子类的Test()覆盖了基类的Test(),并不代表基类的Test()消失,只是不能直接访问

class A
{
public:
void Test(){cout<<"A"<<endl;}
};
class B
{
public:
void Test(){cout<<"B"<<endl;}
};
class C : public A, public B
{
void Test(){cout<<"C"<<endl;}
};
int main()
{
C c;
c.Test(); //正确,输出:C
c.A::Test(); //正确,输出:A
c.B::Test(); //正确,输出:B
return ;
}
 
3.对于单一继承,子类能否访问父类的父类,只与继承的方式有关
对于多重继承,子类不能直接访问父类的父类。
 
4.用virtual来避免二义性。
class B : virtual public A.
 
 
四、继承与包含
1.一个类的成员变量列表中包含另一个类的对象,叫做包含(包容)。
2.包含与私有继承的区别:
包含:
1)使程序看上去更清晰易懂
2)不存在继承带来的问题
3)可以包括另一个类的多个对象
 
私有继承:
1)可以访问基类的保护成员
2)可以重定义虚函数,实现多态
 
 

c++ --> 父类与子类间的继承关系的更多相关文章

  1. python的父类和子类中关于继承的不同版本的写法

    Python 2.7中的继承 在Python 2.7中,继承语法稍有不同,ElectricCar 类的定义类似于下面这样: class Car(object): def __init__(self, ...

  2. Java awt组件间的继承关系

    Container的继承关系: Window是可独立存在的容器,其他则不行.

  3. PythonI/O进阶学习笔记_4.自定义序列类(序列基类继承关系/可切片对象/推导式)

    前言: 本文代码基于python3 Content: 1.python中的序列类分类 2. python序列中abc基类继承关系 3. 由list的extend等方法来看序列类的一些特定方法 4. l ...

  4. C++反汇编第四讲,反汇编中识别继承关系,父类,子类,成员对象

    C++反汇编第四讲,反汇编中识别继承关系,父类,子类,成员对象 讲解目录: 1.各类在内存中的表现形式   备注: 主要复习开发知识,和反汇编没有关系,但是是理解反汇编的前提.     2.子类继承父 ...

  5. C++反汇编第三讲,反汇编中识别继承关系,父类,子类,成员对象

    讲解目录: 1.各类在内存中的表现形式   备注: 主要复习开发知识,和反汇编没有关系,但是是理解反汇编的前提.     2.子类继承父类 2.1 子类中有虚函数,父类中有虚函数 : 都有的情况下   ...

  6. Python父类和子类关系/继承

    #!/usr/bin/env python # -*- coding: utf-8 -*- """ @File:继承_子类和父类的关系.py @E-mail:364942 ...

  7. java子类继承关系

    1.java的类按照继承关系的树形结构所有的类其根节点都是object类,一个类有两种重要的成员,一是变量 .二是方法.子类继承不能继承父类中被声明为private的变量和方法. public cla ...

  8. 转:Java中子类是否可以继承父类的static变量和方法而呈现多态特性

    原文地址:Java中子类是否可以继承父类的static变量和方法而呈现多态特性 静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法,关于static方法,声明 ...

  9. Java中子类是否可以继承父类的static变量和方法而呈现多态特性

    静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法,关于static方法,声明为static的方法有以下几条限制: 它们仅能调用其他的static 方法. 它 ...

随机推荐

  1. Android HotFix动态加载框架介绍

    HotFix(Deprecated) https://github.com/dodola/HotFix 请关注 RocooFix 我重新写了一个RocooFix框架,解决了Nuwa因为Gradle1. ...

  2. 使用mongoVUE删除大量数据的情况下失效问题

    昨天有一个系统出现了问题,导致半夜时大量的错误数据产生,早晨一早接到上边通知让把这些数据尽数删除. 不可否认在数据操作时mongoVUE更加直观,因此一般情况下我也都是使用这个工具,但是今天却出现了问 ...

  3. eclipse报错

    1.eclipse报错具体如下 Error occurred during the build. Errors running builder 'JavaScript Validator' on pr ...

  4. JSP路径出现问题

    1.错误描述 2.错误原因 <%@ page language="java" import="java.util.*" pageEncoding=&quo ...

  5. 如何注册Filter

    AX文件的一个对外接口DllRegisterServer,由外部调用,比如注册AX的时候:regsvr32 xxx.ax       通常情况下,我们的filter可能注册在"Direct ...

  6. HashMap,LinkedHashMap,TreeMap对比

    共同点: HashMap,LinkedHashMap,TreeMap都属于Map:Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复. 不同点: 1.H ...

  7. @postconstruct初始化的操作

    从Java EE 5规范开始,Servlet中增加了两个影响Servlet生命周期的注解(Annotion):@PostConstruct和@PreDestroy.这两个注解被用来修饰一个非静态的vo ...

  8. STM32F4使用FPU+DSP库进行FFT运算的测试过程一

    测试环境:单片机:STM32F407ZGT6   IDE:Keil5.20.0.0  固件库版本:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0 第一部分:使用源码文件的方式,使 ...

  9. as版本切换导致项目损坏,无法启动。环境依赖混乱

    以下方法都不管用, 新建一个项目setting的 把main拷过去就行了!!!! Error:(5, 0) Gradle DSL method not found: 'google()'Possibl ...

  10. 分享到JavaScript

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...