为什么选择C++中的动态角色

为什么选择C++中的动态角色,c++,C++,考虑以下代码: #include <iostream> using namespace std; class Base{ int i; public: virtual bool baseTrue() {return true;} Base(int i) {this->i=i;} int get_i() {return i;} }; class Derived : public Base{ int j; pub

考虑以下代码:

#include <iostream>

using namespace std;

class Base{
    int i;
    public:
    virtual bool baseTrue() {return true;}
    Base(int i) {this->i=i;}
    int get_i() {return i;}
    };

class Derived : public Base{
    int j;
    public:
    Derived(int i,int j) : Base(i) {this->j=j;}
    int get_j() {return j;}
    };

int main()
{
    Base *bp;
    Derived *pd,DOb(5,10);

    bp = &DOb;

    //We are trying to cast base class pointer to derived class pointer
    cout << bp->get_i() << endl;
    cout << ((Derived *)bp)->get_j() << endl;**//HERE1**

    pd=dynamic_cast<Derived*> (bp); **//HERE2**
    // If base class is not polymorphic
    //throw error
    //error: cannot dynamic_cast `bp' (of type `class Base*') to
    //type `class Derived*' (source type is not polymorphic)

    cout << pd->get_j() << endl;**//HERE2**

    //Now we try to cast derived Class Pointer to base Class Pointer

    Base *pb;
    Derived *dp,Dbo(50,100);
    dp = &Dbo;


    cout << ((Base *)dp)->get_i() << endl;**//HERE3**
    //cout << ((Base *)dp)->get_j() << endl;
    //throws error Test.cpp:42: error: 'class Base' has no member named 'get_j'

    pb =  dynamic_cast<Base * > (dp); **//HERE4**
    cout << pb->get_i() << endl; **//HERE4**
    //cout << pb->get_j() << endl;
    //throws error Test.cpp:47: error: 'class Base' has no member named 'get_j'


    return 0;
    }
我在这里1和这里2和这里3和这里4的方式,两者之间的区别是什么?两者都产生相同的输出,所以为什么选择dynamic_cast是安全的,因为当您做了一些不好的事情时,它会抛出异常或返回NULL,或者正如Nawaz所说,它不会编译,因为类型非常糟糕,编译器可以看到它出错

导出的*。。。表单的行为类似于reinterpret_cast…,这是不安全的-它只会将一个指针转换为另一个指针类型,不管这是否会产生有意义的结果。如果表现不好,那是你的问题

您可以这样做:

int x = 4711;

Derived *dp = (Derived *)x; 
cout << dp->get_j(); 
编译器可能会抱怨整数的大小,但否则,它将编译代码。它很可能根本不会运行,但如果运行了,结果可能毫无用处

dynamic_cast是安全的,因为当您做了一些不好的事情时,它要么抛出异常,要么返回NULL,或者正如Nawaz所说,它不编译,因为类型非常糟糕,编译器可以看到它出错

导出的*。。。表单的行为类似于reinterpret_cast…,这是不安全的-它只会将一个指针转换为另一个指针类型,不管这是否会产生有意义的结果。如果表现不好,那是你的问题

您可以这样做:

int x = 4711;

Derived *dp = (Derived *)x; 
cout << dp->get_j(); 

编译器可能会抱怨整数的大小,但否则,它将编译代码。它很可能根本不会运行,但如果运行了,结果可能毫无用处

可能看到这个帖子了吗?你可能会觉得有用。它解释了C++中不同的方法。芒肯:我已经提到了那个教程。我很好奇在我的生活中使用的铸造类型之间的区别code@Gaurav伟大的如果你还没有,这将是一个很好的开始:可能看到这篇文章?你可能会觉得有用。它解释了C++中不同的方法。芒肯:我已经提到了那个教程。我很好奇在我的生活中使用的铸造类型之间的区别code@Gaurav伟大的如果你还没有,那将是一个很好的开始:Mats Peterson。。你的意思是说,如果它是某种派生的,它只是类型转换,而不分析任何结果,转换总是正确的?dynamic_cast是安全的,因为当你做坏事时,它要么抛出一个异常,要么返回NULL,要么它一开始就不编译。@GauravK:我稍微修改了我的答案,是的,我是说,它几乎可以做任何你要求它做的事情,不管这是好事还是坏事;dp=衍生*&x;得不到;已成功编译并生成随机结果。这是C风格的类型转换?除了所有这些非常有力的论证外,Stroustrup提出了一个有效的论点,即很难在代码中看到或搜索C风格的铸件,而用C++强制转换很容易做到。Mats Petersson…你的意思是说,如果它是某种派生的,它只是类型转换,而不分析任何结果,转换总是正确的?dynamic_cast是安全的,因为当你做坏事时,它要么抛出一个异常,要么返回NULL,要么它一开始就不编译。@GauravK:我稍微修改了我的答案,是的,我是说,它几乎可以做任何你要求它做的事情,不管这是好事还是坏事;dp=衍生*&x;得不到;已成功编译并生成随机结果。这是C风格的类型转换?除了所有这些非常有力的论证外,Stroustrup提出了一个有效的论点,即很难在代码中看到或搜索C风格的铸件,而用C++强制转换很容易。