gpt4 book ai didi

c++ - 为什么在 C++ 中选择 dynamic_cast

转载 作者:行者123 更新时间:2023-11-30 01:22:26 32 4
gpt4 key购买 nike

<分区>

考虑下面的代码:

#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;
}

输出

Gaurav@Gaurav-PC /cygdrive/d/Glaswegian/CPP/Test
$ ./Test
5
10
10
50
50

我转换的方式(第 HERE1 和 HERE2 行)&(HERE3 和 HERE4),两者有什么区别?两者产生相同的输出,那么为什么要使用 dynamic_cast

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com