dynamic_cast(C++ dynamic_cast关于if判断 有疑惑)

本文目录
- C++ dynamic_cast关于if判断 有疑惑
- c++关于 dynamic_cast的问题
- c++中的关键字const_cast,dynamic_cast,reinterpret_cast,static_cast都是些什么东西啊
- C++用dynamic_cast将父类指针转换为子类指针,为什么不一定成功
- dynamic_cast的用法
- dynamic_cast 与static_cast的区别
- c++中,dynamic_cast是什么作用
- dynamic_cast 的使用的问题
- C++中的dynamic_cast转换的问题.谢谢指导.
C++ dynamic_cast关于if判断 有疑惑
if(B *b3=dynamic_cast《B*》(a1))你主要要知道这个if中是用什么作为条件判断的,即里面的执行流程
这个if中作为条件判断的是b3
首先是执行B *b3=dynamic_cast《B*》(a1), 然后再用结果b3作为条件判断,如果转换失败,b3=NULL,
也就相当于if(NULL) 或者if(0),所以条件会为假,执行else下面的语句。
c++关于 dynamic_cast的问题
在实用显示的强制类型
dynamic_cast
的时候,在vc6.0下需要设置,才可以使用。
工程(projece)-》设置(setting)
在里面知道c/c++那个选项。
然后在下面分类中选
c++语言
然后在
勾中下面一个选项
叫允许时间类型信息(rtti)
然后确定就可以使用了。
否则的话,是不可以使用的,运行会出错。
c++中的关键字const_cast,dynamic_cast,reinterpret_cast,static_cast都是些什么东西啊
强制类型转换运算符:C++有四种强制类型转换符,分别是dynamic_cast,const_cast,static_cast,reinterpret_cast。其中dynamic_cast与运行时类型转换密切相关,在这里我们先介绍dynamic_cast,其他三种在后面介绍。
6.1、dynamic_cast强制转换运算符:该转换符用于将一个指向派生类的基类指针或引用转换为派生类的指针或引用,注意dynamic_cast转换符只能用于含有虚函数的类,其表达式为dynamic_cast《类型》(表达式),其中的类型是指把表达式要转换成的目标类型,比如含有虚函数的基类B和从基类B派生出的派生类D,则B *pb; D *pd, md; pb=&md pd=dynamic《D*》(pb); 最后一条语句表示把指向派生类D的基类指针pb转换为派生类D的指针,然后将这个指针赋给派生类D的指针pd,有人可能会觉得这样做没有意义,既然指针pd要指向派生类为什么不pd=&md这样做更直接呢?有些时候我们需要强制转换,比如如果指向派生类的基类指针B想访问派生类D中的除虚函数之外的成员时就需要把该指针转换为指向派生类D的指针,以达到访问派生类D中特有的成员的目的,比如派生类D中含有特有的成员函数g(),这时可以这样来访问该成员dynamic_cast《D*》(pb)-》g();因为dynamic_cast转换后的结果是一个指向派生类的指针,所以可以这样访问派生类中特有的成员。但是该语句不影响原来的指针的类型,即基类指针pb仍然是指向基类B的。如果单独使用该指针仍然不能访问派生类中特有的成员。一般情况下不推见这样使用dynamic_cast转换符,因为dynamic_cast的转换并不会总是成功的,具体情况在后面介绍。
6.2、dynamic_cast的注意事项:dynamic_cast转换符只能用于指针或者引用。dynamic_cast转换符只能用于含有虚函数的类。dynamic_cast转换操作符在执行类型转换时首先将检查能否成功转换,如果能成功转换则转换之,如果转换失败,如果是指针则反回一个0值,如果是转换的是引用,则抛出一个bad_cast异常,所以在使用dynamic_cast转换之间应使用if语句对其转换成功与否进行测试,比如pd=dynamic_cast《D*》(pb); if(pd){…}else{…},或者这样测试if(dynamic_cast《D*》(pb)){…}else{…}。
6.3、const_cast操作符:其表达式为const_cast《类型》(表达式),其中类型指要把表达式转换为的目标类型。该操作符用于改变const和volatile,const_cast最常用的用途就是删除const属性,如果某个变量在大多数时候是常量,而在某个时候又是需要修改的,这时就可以使用const_cast操作符了。const_cast操作符不能改变类型的其他方面,他只能改变const或volatile,即const_cast不能把int改变为double,但可以把const int改变为int。const_cast只能用于指针或引用。const_cast的用法举例比如:int a=3; const int *b=&a int* c; c=const_cast《int*》(b); *c=4; cout《《a《《*c;这时输出两个4,如果不使用const_cast转换符则常量指针*c的值是不能改变的,在这里使用const_cast操作符,通过指针b就能改变常量指针和变量a的值。
6.4、static_cast操作符:该操作符用于非多态类型的转换,任何标准转换都可以使用他,即static_cast可以把int转换为double,但不能把两个不相关的类对象进行转换,比如类A不能转换为一个不相关的类B类型。static_cast本质上是传统c语言强制转换的替代品。
6.5、reinterpret_cast操作符:该操作符用于将一种类型转换为另一种不同的类型,比如可以把一个整型转换为一个指针,或把一个指针转换为一个整型,因此使用该操作符的危险性较高,一般不应使用该操作符。
C++用dynamic_cast将父类指针转换为子类指针,为什么不一定成功
这个问题牵扯到c++的对象模型。一般认为子类对象大小》=父类对象大小。为什么?因为子类可以扩展父类,可以增加成员变量。如果一个子类增加了成员变量,那么它的对象的内存空间会大于父类对象。这时一个实际指向父类的指针,如果被强制转化为子类对象指针,当使用这个指针时可能会导致越界访问非法内存。相反,为何子类指针可以转换为父类指针?因为父类指针需要的,子类对象都有,不会出现非法内存访问。
这就是dynamic_cast不一定成功的原因。如果一个实际指向子类对象的指针被转换成了父类指针,然后再用dynamic_cast转换回来,一定能成功,而一个实际指向父类对象的指针,被dynamic_cast转换为子类指针,一定会失败。
dynamic_cast的用法
dynamic_cast 《type-id》 (expression)
该运算符把expression转换成type-id类型的对象。Type-id 必须是类的指针、类的引用或者void*;
如果 type-id 是类指针类型,那么expression也必须是一个指针,如果 type-id 是一个引用,那么 expression 也必须是一个引用。
dynamic_cast运算符可以在执行期决定真正的类型。如果 downcast 是安全的(也就说,如果基类指针或者引用确实指向一个派生类对象)这个运算符会传回适当转型过的指针。如果 downcast 不安全,这个运算符会传回空指针(也就是说,基类指针或者引用没有指向一个派生类对象)。
dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;
在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。 classB{public:int m_iNum;virtual void foo();};classD:publicB{public:char* m_szName;};void func(B* pb){D* pd1=static_cast《D*》(pb);D* pd2=dynamic_cast《D*》(pb);}在上面的代码段中,如果 pb 指向一个 D 类型的对象,pd1 和 pd2 是一样的,并且对这两个指针执行 D 类型的任何操作都是安全的;但是,如果 pb 指向的是一个 B 类型的对象,那么 pd1 将是一个指向该对象的指针,对它进行 D 类型的操作将是不安全的(如访问 m_szName),而 pd2 将是一个空指针。
另外要注意:B 要有虚函数,否则会编译出错;static_cast则没有这个限制。
这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表(关于虚函数表的概念,详细可见《Inside c++ object model》)中,只有定义了虚函数的类才有虚函数表,没有定义虚函数的类是没有虚函数表的。
dynamic_cast 与static_cast的区别
一个动态转换,一个是静态转换。一般情况下使用static_case《类型》
就可以了。
同时,这个只有在高版本的C++编译器中才能识别。
dynamic_cast是试探映射,如dynamic_cast《A》*pB意思是“我希望它是A*,并打算要求它是”。它通常被称为类层次的动态导航。
而static_cast通常可用于类层次的静态导航,无映射变换,窄化变换(会丢失信息)等等,static_cast的应用要广一些,但如前所提到的,在类层次导航变换中我们应该使用前者,因为后者static_cast可能意味着冒险(比如变换时类似于强制转换一样丢失信息)。但是在一个类层次中没有虚函数或者我们确定有其他允许我们安全向下映射的信息则后者static_cast更快一些。
c++中,dynamic_cast是什么作用
dynamic_cast
用于多态性的父子类型对象的指针或引用之间。
class A {
public:
virtual ~A (void) {}
};
class B : public A {};
class C : public B {};
int main (void) {
B b;
A* pa = &b
cout 《《 “pa = “ 《《 pa 《《 endl;
cout 《《 “---- dynamic_cast ----“ 《《 endl;
// pa实际指向B对象,转换成功
B* pb = dynamic_cast《B*》 (pa);
cout 《《 “pb = “ 《《 pb 《《 endl;
// pa没有指向C对象,转换失败
C* pc = dynamic_cast《C*》 (pa);
cout 《《 “pc = “ 《《 pc 《《 endl;//这里应该pc=NULL
}
dynamic_cast 的使用的问题
在实用显示的强制类型
dynamic_cast
的时候,在VC6.0下需要设置,才可以使用。
工程(projece)-》设置(setting)
在里面知道C/C++那个选项。
然后在下面分类中选
C++语言
然后在
勾中下面一个选项
叫允许时间类型信息(RTTI)
然后确定就可以使用了。
否则的话,是不可以使用的,运行会出错。
C++中的dynamic_cast转换的问题.谢谢指导.
子类对象可以直接强制转换为父类对象的,所以这样没错啊。wiki说的是当两个类型不兼容时,才会抛出异常。但是子类和父类明显是兼容的嘛。并且还有一个有意思的现象,假如你分别定义类A,B,里面都只有一个int变量,你可以将这个变量设为public权限的,以便于修改。那么你可以定义一个A对象,然后定义一个B指针,将A的地址强制转换为B类型的指针,你会发现B类的指针也可以访问A类对象的成员。
具体代码:
class A
{public: int a;}
class B
{public: int b;}
void main()
{
A a1;
a1.a = 10;
B* b1 = (b1*)&a1
cout 《《 b1-》b 《《 endl;//这里会输出10
}

更多文章:
易语言网页api接口怎么调用(易语言,怎么读取网页json的api)
2026年10月11日 08:00
majority of(the majority of 和 a majority of的区别以及用法例句)
2026年10月11日 07:40
another time(another time和other time的区别)
2026年10月11日 05:00








