C++的类型转换初认识(2)

reinterpret_cast
仅仅是复制n1的比特位到d_r, 没有进行必要的分析.interpret_cast是为了映射到一个完全不同类型\
的意思,这个关键词在我们需要把类型映射回原有类型时用到它。我们映射到的类型仅仅是为了故弄\
玄虚和其他目的,这是所有映射中最危险的。(这句话是C++编程思想中的原话

const_cast
去除const常量属性,使其可以修改volatile属性的转换 易变类型<->不同类型.

#include <iostream>
#include <cstdio>
#include <string>

using namespace std;

class A {
    public:
    A(){};
    int m_a;
};

class B {
    public:
    int m_b;
};

class C : public A, public B {};

int main()
{
    const A a;
    //a.num = 1;
    const_cast<A&>(a).m_a = 2;
    //a.num = 3;编译不能通过,说明const_cast只能转换一次,不是永久脱离原有const属性
    cout<<a.m_a<<endl;
    int n = 9;
    double d_s = static_cast<double>(n);
    double d_r = reinterpret_cast<double&>(n);
    cout<<d_r<<endl;//4.24399e-314
    //在进行计算以后, d_r包含无用值. 这是因为 reinterpret_cast仅仅是复制n1的比特位到d_r, 没有进行必要的分析.interpret_cast是为了映射到一个完全不同类型的意思,这个关键词在我们需要把类型映射回原有类型时用到它。我们映射到的类型仅仅是为了故弄玄虚和其他目的,这是所有映射中最危险的。(这句话是C++编程思想中的原话
    return 0;
}

#include <iostream>
#include <typeinfo>
#include <cstdio>

using namespace std;

class A{
public:
virtual void foo(){
cout<<"A foo"<<endl;
}
//虚函数的出现会带来动态机制 Class A 至少要有一个虚函数
void pp(){
cout<<"A pp"<<endl;
}
};

class B: public A{
public:
void foo(){
cout<<"B foo"<<endl;
}
void pp(){
cout<<"B PP"<<endl;
}
void functionB(){
cout<<"Excute FunctionB!"<<endl;
}
};

int main()
{
B b;
A pa = &b;
pa->foo();
pa->pp();
//基类指针可以指向派生类,但是只能调用基类和派生类都存在的成员,也就是说不能调用派生类中新增的成员!
//pa->FunctionB();//error: 'class A' has no member named 'FunctionB'
if(dynamic_cast<B>(pa) == NULL){
cout<<"NULL"<<endl;
}else{
cout<<typeid((dynamic_cast<B>(pa))).name()<<endl;
dynamic_cast<B>(pa)->foo();
dynamic_cast<B>(pa)->pp();
dynamic_cast<B>(pa)->functionB();
}
A aa;
//B pb = &aa;派生类不能指向基类
B pbNull = NULL;
pbNull->functionB();//fine
pbNull->pp();//fine
//pbNull->functionB(); crash!foo调用了虚函数,编译器需要根据对象的虚函数指针查找虚函数表,但为空,crash!
return 0;
}

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/519748b1a7d37d6e79803f7c3ba06c1c.html