子类与父类之间的类型转换

先给一段代码

class Base {
public:
int a = 10;
}; class pub_Derv : public Base {
Base *getBase() {return this;}
}; class prot_Derv : protected Base {
Base *getBase() {return this;}
}; class priv_Derv : private Base {
Base *getBase() {return this;}
}; class pub_pub_Derv : public pub_Derv {
Base *getBase() {return this;}
}; class pub_prot_Derv : public prot_Derv {
Base *getBase() {return this;}
}; class pub_priv_Derv : public priv_Derv {
//Base *getBase() {return this;}
};

1、对象类型不存在类型转换

Base b;
pub_Derv pd;
b = pd; // 是调用了Base的拷贝构造函数,而不是类型转换
pd = b; // 调用pub_Derv的拷贝赋值运算符,但是Base类型不能转为pub_Derv类型的引用,这个语句会报错。

2、子类的指针或引用转为父类的指针或引用:子类--->父类

不是子类的指针或引用就能转为父类的指针或引用,前提条件是子类的指针或引用在当前域(域内:类体类->成员函数和友元函数 域外:类体外)能够访问访问父类的public的成员,因为父类对象在域外就是能访问其public成员。

  • 子类对象在域外
Base *p;
p = new pub_Derv; // 正确转换,Base的public成员在pub_Derv中还是public的,所以pub_Derv的域外对象能够访问Base的public成员。
p = new prot_Derv; // 错误转换,Base的public成员在prot_Derv中还是protected的,所以prot_Derv的域外对象不能访问Base的public成员。
p = new priv_Derv; // 错误转换,Base的public成员在priv_Derv中还是private的,所以priv_Derv的域外对象不能访问Base的public成员。
p = new pub_pub_Derv; // 正确转换,Base的public成员在pub_pub_Derv中还是public的,所以pub_pub_Derv的域外对象能够访问Base的public成员。
p = new pub_prot_Derv; // 错误转换,Base的public成员在pub_prot_Derv中是protected的,所以pub_prot_Derv的域外对象不能访问Base的public成员。
p = new pub_priv_Derv; // 错误转换,Base的public成员在pub_priv_Derv中是inaccessible的,所以pub_priv_Derv的域外对象不能访问Base的public成员。
  • 子类对象在域内
class pub_prot_Derv : public prot_Derv {
// 正确转换,Base的public成员在pub_prot_Derv中是protected的,pub_prot_Derv的域内对象能够访问pub_prot_Derv的protected成员,
// 所以pub_prot_Derv的域内对象能转换为Base对象。
Base *getBase() {return this;}
}; class pub_priv_Derv : public priv_Derv {
// 错误转换,因为Base的public成员在priv_Derv中是private的,到了pub_priv_Derv就变成inaccessible的了,也就是说在pub_priv_Derv的域内
// 也访问不了Base的public成员,所以pub_priv_Derv的域内对象不能转换为Base对象。
Base *getBase() {return this;}
};

3、父类指针或引用转为子类指针或引用:父类--->子类

Base *pb = new pub_Derv;
// 父类指针或引用本来就是指向子类对象,则可以通过强制类型转换进行父类到子类的转换,来屏蔽编译器的检测,
// 如果父类不是指向之类,而这样转换就很危险了。
pub_Derv pb2 = static_case<pub_Derv>(pb);

c++ 子类与父类之间的类型转换的更多相关文章

  1. Java子类与父类之间的类型转换

    1.向上转换 父类的引用变量指向子类变量时,子类对象向父类对象向上转换.从子类向父类的转换不需要什么限制,只需直接蒋子类实例赋值给父类变量即可,这也是Java中多态的实现机制. 2.向下转换 在父类变 ...

  2. (转载) Java子类与父类之间的对象转换

    在使用Java的多态机制时,常常使用的一个特性便是子类和父类之间的对象转换.从子类向父类的转换称为向上转换(upcasting),通过向上转换,我们能够在编写程序时采用通用程序设计的思想,在需要使用子 ...

  3. java 静态资源,非静态资源,父类子类,构造方法之间的初始化循序

    java面试经常被问静态资源,非静态资源,父类子类,构造方法之间的执行顺序.下面添加两个类做个测试 class Parent { // 静态变量 public static String p_Stat ...

  4. 存在继承关系的Java类对象之间的类型转换(一)

      类似于基本数据类型之间的强制类型转换. 存在继承关系的父类对象和子类对象之间也可以 在一定条件之下相互转换. 这种转换需要遵守以下原则: 1.子类对象可以被视为是其父类的一个对象2.父类对象不能被 ...

  5. Java对象多态性——对象的转型(引用类型之间的类型转换)

    Java引用变量有两个类型:编译时类型和运行时类型.编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定. 若编译时类型和运行时类型不一致,就出现多态 正常的方法调用(本态调用 ...

  6. c++继承构造子类调用父类构造函数的问题及关于容器指针的问题及当容器里储存指针时,记得要手动释放

    看下面的一个问题: class Person { private: string name; public: Person(const string& s=""){ nam ...

  7. 阿里 Java 手册系列教程:为啥强制子类、父类变量名不同?

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 目录 父子类变量名相同会咋样? 为啥强制子类.父类变量名不同? ...

  8. c++中子类转父类,父类转子类

    #include <iostream> using namespace std; class Father { public: virtual void show() { cout< ...

  9. Python基础-接口与归一化设计、抽象类、继承顺序、子类调用父类,多态与多态性

    一.接口与归一化设计 Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 由 ...

随机推荐

  1. Python操作数据库实战

    pymysql # -*- coding: utf-8 -*- """ @Datetime: 2018/12/26 @Author: Zhang Yafei " ...

  2. ElasticSearch的应用

    一.介绍 全文检索技术: 分布式: Restful风格: 近实时搜索 二.部署 下载:https://thans.cn/mirror/elasticsearch.html 新建用户,并登录: 解压: ...

  3. fis学习

    http://fis.baidu.com/docs/beginning/getting-started.html#md5 还是喜欢时间戳?没问题,FIS也可以满足你的需求,点击这里

  4. Keil MDK STM32系列(七) STM32F4基于HAL的PWM和定时器

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  5. 计算机视觉2-> 深度学习 | anaconda+cuda+pytorch环境配置

    00 想说的 深度学习的环境我配置了两个阶段,暑假的时候在一个主攻视觉的实验室干活,闲暇时候就顺手想给自己的Ubuntu1804配置一个深度学习的环境.这会儿配到了anaconda+pytorch+c ...

  6. 【C】C语言大作业——学生学籍管理系统

    文章目录 学生管理系统 界面 主界面 登陆界面 注册界面 管理界面 学生界面 退出界面 链接 注意 学生管理系统 学C语言时写的一个大作业,弄了一个带图形界面的,使用的是VS配合EasyX图形库进行实 ...

  7. func-spring-boot-starter 快速上手

    func-spring-boot-starter test 项目地址 func-spring-boot-starter项目地址: https://gitee.com/yiur/func-spring- ...

  8. 【Android】安卓四大组件之Activity(一)

    [Android]安卓四大组件之Activity(一) 前言 Activity是Android学习中的一个重要组件,想要对其进行系统的了解可以分为几块内容,这一大章节的内容是有关于activity之间 ...

  9. C# 文件对话框例子

    OpenFileDialog控件的基本属性InitialDirectory:对话框的初始目录 Filter: 获取或设置当前文件名筛选器字符串,例如,"文本文件(*.txt)|*.txt|所 ...

  10. 使用idea时jsp中使用out.print();时报错的解决办法

    在用Maven创建web项目时 在jsp页面中out.print();老是报错 这边print显示红色出错因为这边使用的是JSP的API并不是Servlet的,但是可以运行,所以我们只要导包就完事其实 ...