派生类的对象都含有基类对象作为其一部分,我们可以将指向派生类型的引用转换为指向它的基类型的引用,像转换指针一样,我们可以用派生类的对象初始化或赋值基类对象,反之却不行。class base{
public:
};

class derived:public base{
public:
};

int main(void) {
    derived obj_d;
    base obj_b=obj_d;//赋值运算符
    base obj_b2(obj_d);//用派生类对象初始化

derived &ref_d=obj_d;
    base &ref_b=ref_d;
    base &ref_b2(ref_d);

cout<<"end in main/n";
    return EXIT_SUCCESS;
}
 
程序编译没有错误,只是会提示ref_b,ref_b2没有使用,如果反过来转换基类对象或引用为派生类型的则会报错。
实际上,这里编译器并没有将派生类对象或引用“转换”为基类型的,只是用派生类对象中的基类部分初始化或赋值基类对象,引用方面,将派生类基类部分的地址传递给基类型的引用。
前面在虚函数实例时,看到将派生类对象传递给参数为基类型引用的函数,这时传递的是地址,实参的派生类对象还是派生类对象。
如果是参数为基类对象的函数,情况有所不同,实参派生类对象的基类部分会被复制给一个函数体内建立的临时的基类对象。

当我们用派生类对象初使化或赋值基类对象时,有两种可能:
1.基类中定义了相应的构造函数和重载了赋值运算符,这时将会按照相应的函数进行
class derived;
class base{
public:
    base(const derived&);
    base& operator=(derived &);
};

2.基类中并没有定义相关的函数,与情况1相比,这种情况更为常见。
  通常基类中会有考构,其参数为const 基类型引用,考构会帮我们完成派生类对象初始化或赋值基类型对象,其中发生指向派生类的引用转换为基类型的引用。开头的示例程序:

base obj_b=obj_d;//赋值运算符
    base obj_b2(obj_d);//用派生类对象初始化,调用的构造函数
派生类中的基类部分好像被“切割”(slice down)下一样,赋值给基类对象。

派生类-基类 转换后的成员访问问题
  如果是公有派生,转换后,可以访问基类对象的相应成员,如果是保护或私有派生则不可。
class base{
public:
    int pub;
protected:
    int pro;
};

class derived:public base{
public:
};

int main(void) {
    derived obj_d;
    base obj_b=obj_d;//赋值运算符

cout<<obj_b.pub<<" "<<endl;
    cout<<"end in main/n";
    return EXIT_SUCCESS;
}

程序没有任何问题,输出结果为一随机值,因为我们没有定义任何构造函数为数据成员初始化。
如果将派生类型变为保护或私有
class derived:protected base{
public:
};
 
编译报错  `base' is an inaccessible base of `derived'
而且,私有派生时,其后续派生的类是不可转换为基类型的,保护派生可以。

基类-派生类 的转换
无论是用基类对象还是引用初始化派生类对象或引用都是不可以的,基类对象其所占的内存空间中并没有派生类所定义的只属于它自己的那一部分。即使是有一个基类型的引用,其此时正好指向一个派生类对象,我们也不可将其转换为派生类型的引用,因为编译时编译器检查的是静态类型。

转载于:https://blog.51cto.com/lihaichuan/1060930

派生类类型可以转换为基类类型,反之则不行相关推荐

  1. 派生类到基类的转换 和基类到派生类的转换

    一. 基类与派生类的转换     3种继承方式(公用.保护.私有继承)中,公用派生类才是基类真正的子类型,它完整地继承了基类的功能.     不同类型数据之间在一定条件下可以进行类型的转换.基类与派生 ...

  2. 将派生类指针赋值给基类的指针

    除了可以将派生类对象赋值给基类对象(对象变量之间的赋值),还可以将派生类指针赋值给基类指针(对象指针之间的赋值).我们先来看一个多继承的例子,继承关系为: #include <iostream& ...

  3. c++,派生类对象可以对基类赋值,基类对派生类不可以赋值

    派生类对象可以对基类对象赋值,赋值时属于派生类独有的部分就舍弃不用. #include <iostream> using namespace std;class DemoA { publi ...

  4. C++ 类的继承,基类,派生类

    继承: 当创建一个类时,不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可. 这个已有的类称为基类,新建的类称为派生类. 例: //基类class Animal {// ...

  5. 【C++】继承和派生、虚继承和虚基类、虚基类表和虚基类指针

    继承和派生.虚继承和虚基类.虚基类表和虚基类指针 继承和派生 继承概述 继承基本概念 派生类中的成员 继承的内容 派生类定义 派生类访问控制 对象构造和析构 对象构造和析构的调用顺序 继承中的构造和析 ...

  6. 模板类中使用友元函数的方式,派生类友元函数对基类的成员使用情况

    在一般友元函数的前面加上 template<typename T),注意在函数的声明和定义处都要加这个模板 例如: //模板类,长方体类 template <typename Elemen ...

  7. 不是抽象类的基类不是好基类

    开宗明义:不是抽象类的基类不是好基类.为什么这么说? 基类和派生类的关系有如下几种: 基类可以是具体类.虚类和抽象类三种,对派生类没有要求.其中具体类是没有虚函数的类,其所有方法都提供了具体实现:派生 ...

  8. java 虚基类_C++中虚基类与抽象类的简单理解。

    虚基类   是相对于它的派生类而言的,它本身可以是一个普通的类. 只有它的派生类虚继承它的时候,它才称作虚基类,如果没有虚继承的话,就称为基类.比如类B虚继承于类A,那类A就称作类B的虚基类,如果没有 ...

  9. C++中虚继承产生的虚基类指针和虚基类表,虚函数产生的虚函数指针和虚函数表

    本博客主要通过查看类的内容的变化,深入探讨有关虚指针和虚表的问题. 一.虚继承产生的虚基类表指针和虚基类表 如下代码:写一个棱形继承,父类Base,子类Son1和Son2虚继承Base,又来一个类Gr ...

最新文章

  1. LINUX内核经典面试题30道及解答
  2. 【Demo】改变SO项目状态并取消拒绝原因实现
  3. 一步步编写操作系统 53 任务状态段TSS介绍
  4. 在ubuntu上搭建开发环境9---Ubuntu删除ibus出现的问题及解决
  5. C# 文件读取方法,自己写的例子,保存一下,备用
  6. 日志log4j配置详情,日志log具体到你想不到
  7. 中心频点计算公式_LTE网各频段中心频点的计算方法_刘20170105
  8. [Perl系列—] 2. Perl 中的引用使用方法
  9. python数据分析案例分析题_7个python案例中的数据思维
  10. 3分钟快速了解,如何一次通过CISSP考试?
  11. spring boot中如何实现在手机注册和登录时获取验证码(阿里短信服务)
  12. 网站木马修复网站漏洞修复方案
  13. mysql中字段长度到底是字符数还是字节数?
  14. 真的有人能开启上帝视角,所有人在他眼里一览无余?
  15. ubuntu如何安装java jdk,Ubuntu下安装JDK图文详解
  16. Hadoop回收站trash
  17. 中国高铁票价世界最低
  18. 小学学计算机学flash动画,flash动画教学计划
  19. Verdi的简单使用命令笔记
  20. 项目3:美国大选献金目数据分析

热门文章

  1. 102. 二叉树的层序遍历 golang
  2. 【汇编语言】数据类型的匹配问题:自动匹配与手动匹配
  3. Linux进程通信之管道
  4. make文件基础用法
  5. C++ 内存管理机制
  6. 《HTTP 权威指南》笔记:第十五章 实体与编码
  7. mysql删除一条记录
  8. HDUOJ 1062 TEXT REVERSE
  9. python函数使用易错举例
  10. 2017-12-07 socket 读取问题