zoukankan      html  css  js  c++  java
  • 显式转换与隐式转换

    下面哪种情况下,B不能隐式转换为A?
    class B:public A{}
    class A:public B{}
    class B{operator A();}
    class A{A(const B&);}

    显式转换是由程序员自己主动完成,隐式转换是由编译器完成的,其二显示转换一般是由高向低,隐式转换是由低到高,其三显式转换的格式为类型(对象)或(类型)对象。

    static_cast, dynamic_cast, const_cast探讨

    • 用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成子类指针或引用)时,由于没有动态类型检查,所以是不安全的。



    public之后的是基类,A中A是基类,B是派生类,B转A的时候会产生切片问题,是可行的;


    表示A是基类,B是派生类,向上级类型转换是隐式的因为部分元素丢弃可以自动完成,向下转型是显式的因为不知道应该增加的值是什么。所以B不能。
    答案C,Operator除了表示函数重载操作符,还可以表示B类型可以装换为A类型。
    B中B是基类,A是派生类,因为A中有B中不存在的部分,隐式转换会发生问题,可以采用强制类型转换dynamic_cast<A> b;
    C不太清楚,但可以肯定B错
    D是复制构造函数,楚翔a=b;的时候可以调用,故可以隐式转换;
     
     
     1 #include<iostream>
     2 using namespace std;
     3 class B0//基类BO声明
     4 {
     5 public://外部接口
     6     virtual void display()//虚成员函数
     7     {
     8         cout<<"B0::display0"<<endl;}
     9 };
    10 class B1:public B0//公有派生
    11 {
    12 public:
    13     void display() { cout<<"B1::display0"<<endl; }
    14 };
    15 class D1: public B1//公有派生
    16 {
    17 public:
    18     void display(){ cout<<"D1::display0"<<endl; }
    19 };
    20 void fun(B0 ptr)//普通函数
    21 {
    22     ptr.display();
    23 }
    24 int main()//主函数
    25 {
    26     B0 b0;//声明基类对象和指针
    27     B1 b1;//声明派生类对象
    28     D1 d1;//声明派生类对象
    29     fun(b0);//调用基类B0函数成员
    30     fun(b1);//调用派生类B1函数成员,子类向上隐式类型转换为父类
    31     fun(d1);//调用派生类D1函数成员,子类向上隐式类型转换为父类
    32 }

    正确答案: A 

    B0::display() B0::display() B0::display()
    B0::display() B0::display() D1::display()
    B0::display() B1::display() D1::display()B0::display() B1::display() B1::display(
    虚函数的动态绑定仅在 基类指针或引用绑定派生类对象时发生  ,fun的形参不是指针,所以调用哪个版本的函数编译时就已经确定,
    根据形参静态类型确定调用B0的成员。

    此题的关键点在于fun函数,传入的参数是一个类的对象,这样,派生类作为参数传入的时候,会自动的类型转换为基类对象,
    这样,display就只是执行基类的函数了。选B0::display() B0::display() B0::display()





  • 相关阅读:
    linux驱动---等待队列、工作队列、Tasklets【转】
    Pinctrl子系统之一了解基础概念【转】
    Linux内存管理(最透彻的一篇)【转】
    linux驱动学习笔记---实现中断下半部以及驱动编写规范(七)【转】
    一些网址下载【转】
    Linux /proc/$pid部分内容详解【转】
    Linux kernel workqueue机制分析【转】
    Linux进程核心调度器之主调度器schedule--Linux进程的管理与调度(十九)【转】
    Linux Kernel PANIC(三)--Soft Panic/Oops调试及实例分析【转】
    Linux内核调试的方式以及工具集锦【转】
  • 原文地址:https://www.cnblogs.com/guxuanqing/p/5931922.html
Copyright © 2011-2022 走看看