dynamic_cast类型不完整的问题
dynamic_cast issue with incomplete type
class A
{
public:
virtual void func() {
cout<<" func():: in class A"<< endl;
}
void func1(){
cout<<"func1():: in class A";
}
};
class B: public A {
public:
void func() {
cout<<" func():: in class B"<< endl;
}
void func1(){
cout<<"func1():: in class B";
}
};
int main()
{
A a;
A* pa = &a;
B* pb = dynamic_cast<B*>(pa);
pb->func1();
return 0;
}
虽然pb
指向一个不完整的类型,dynamic_cast
会返回null
。但是为什么在这种情况下它不会崩溃?
由于B
类中的func1
不访问任何成员变量(或虚函数),因此它不使用隐式this
指针,因此在这种情况下不会崩溃。
请注意,这是未定义的行为,因此它可能会在不同的编译器(或编译器版本)中崩溃(或执行意外操作),因此不要依赖此行为。
您有一个指向A
实例的A *
,而不是实际指向B
实例A *
。这就是为什么dynamic_cast
返回一个类型的 null 指针 B *
,它与这些是不完整的类型或任何内容无关(在链接的代码中,A
和 B
都是完整的类型),因此这是dynamic_cast
定义的行为。但是,在此之后将访问空指针;聪明的编译可以知道dynamic_cast
在这一点上可能会失败,并且pb->func1();
可以做任何事情,包括不导致空指针异常或根本不会导致任何事情,甚至在不B
的东西上调用pb1->func
。
类型不完整的示例如下:
#include <iostream>
using namespace std;
class A {
public:
virtual void func() {
cout << "func():: in class A" << endl;
}
void func1(){
cout<< "func1():: in class A";
}
};
class B;
int main() {
A a;
A* pa = &a;
B* pb = dynamic_cast<B*>(pa);
return 0;
}
现在,如果你用 G++ 编译它,你会得到
y.cc: In function ‘int main()’:
y.cc:20:32: error: cannot dynamic_cast ‘pa’ (of type ‘class A*’) to
type ‘class B*’ (target is not pointer or reference to complete type)
B* pb = dynamic_cast<B*>(pa);
这都是理智的C++编译器会拒绝这样的代码。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 如何理解C++标准N3337中的expr.const.cast子句8
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- 谁能帮助确定为什么这不能正确执行?如果问题与cast