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

先给一段代码

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. 第10组 Alpha冲刺 (3/6)(组长)

    1.1基本情况 ·队名:今晚不睡觉 ·组长博客:https://www.cnblogs.com/cpandbb/p/13971668.html ·作业博客:https://edu.cnblogs.co ...

  2. Nginx高级模块学习

    Nginx的rewrite规则 实现url重写一级重定向 使用场景: 1.URL访问跳转,支持开发设计 页面跳转.兼容性支持.展示效果 2.SEO优化 3.维护 后台维护.流量转发等 4.安全 配置语 ...

  3. Idea操作Maven详细使用:

    Idea操作Maven详细使用: Maven简介 什么是 Maven Maven 的正确发音是[ˈmevən] "卖v",而不是"马瘟"以及其他什么瘟. Mav ...

  4. JDK8 一文搞定👍

    ! https://zhuanlan.zhihu.com/p/442182870 Java8 新特性 学习来源于 B站 尚硅谷yyds Java学习源码 2021/11/22 距离,过年还有 57 天 ...

  5. dubbo系列二、dubbo请求流程记录

    目录 1.dubbo请求处理流程 1.1. consumer端处理流程 1.2.provider端处理流程 1.3.dubbo请求分析记录-图 泳道图 xmind图 2.dubbo请求核心说明 1.d ...

  6. C#获取http图片

    public Image GetHttpImage(string url) { var client = new HttpClient(); var uri = new Uri(Uri.EscapeU ...

  7. 【记录一个问题】golang神坑,明明返回了接口指针类型的nil值,却无法用if判断

    先看看导致异常的代码: package main import ( "fmt" "log" ) type MyError1 struct{ MyErrorCod ...

  8. 【记录一个问题】android opencl c++: 不要Context, CommandQueue类的赋值函数

    一开始代码中这样写了: cl::Context ctx = cl::Context(CL_DEVICE_TYPE_GPU, NULL); cl::CommandQueue queue= cl::Com ...

  9. MySql服务器逻辑架构

    一.MySql服务器逻辑架构图         每个虚线框都是一层: 第一层:最上层的服务器不是MySql所独有的,大多数基于网络的客户端/服务器工具或者服务都有类似的系统.比如链接处理,授权认证,安 ...

  10. 淘系工程师讲解的使用Spring特性优雅书写业务代码

    使用Spring特性优雅书写业务代码   大家在日常业务开发工作中相信多多少少遇到过下面这样的几个场景: 当某一个特定事件或动作发生以后,需要执行很多联动动作,如果串行去执行的话太耗时,如果引入消息中 ...