我在google上搜索了关于dynamic_cast的内容,我发现显式地转换基类对象来派生类指针可能不安全.但是,当我运行一些示例代码来检查这个时,我没有收到任何错误.请在下面找到我的代码:
class A
{
virtual void get(){}
};
class B : public A
{
public: void print(void)
{
cout << "In B's print" << endl;
}
void get()
{
cout <<" In B's get" << endl;
}
};
int main()
{
A a;
//A *a1 = &a;
B* b;
b = (B*)(&a);//c-style casting base class object to derive class pointer
b->print();
/*b = dynamic_cast<B*>(&a); // dynamic casting base class object to derive class pointer
if(b)
b->print();
else
cout << "failed" << endl;*/
}
Run: c++ cast.cpp
Run: ./a.out
o/p:- In B's print
Run Code Online (Sandbox Code Playgroud)
据我所知,b-> print()应该失败,因为基类没有关于派生类的所有信息.
如果我使用dynamic_cast运行相同的代码,它将在转换后返回null并且输出将失败.
有人可以清楚我的怀疑吗?如果有任何错误或不适当,请纠正我.
通过dynamic_cast运行时检查,您投射的内容确实可以转换为您想要的内容.
使用C风格的演员你基本上告诉编译器"我知道我在做什么,不要妨碍我".如果你犯了错误,这是一个很好的方式射击自己的脚.C风格的演员类似reinterpret_cast但不太安全.
在这种情况下,因为&a是不是一个指针B,你确实拍摄自己的脚,因为该指针b将指向的东西,这不是一个B.如果您尝试以任何方式解除引用,则会导致未定义的行为b.
| 归档时间: |
|
| 查看次数: |
56 次 |
| 最近记录: |