dynamic_cast不能保证一个有效、完整的对象?
dynamic_cast doesn't guarantee a valid, complete object?
我正在阅读此页面,它说
dynamic_cast只能与指针和对对象的引用一起使用。其目的是确保类型转换的结果是所请求类的有效完整对象。
但是当我这样做时,dynamic_cast没有给出一个有效的对象:
struct A{};
struct B:A{};
void main(){
A a;
B b;
B* bPtr = (B*) 0x0000001;
A* aPtr = dynamic_cast<A*>(bPtr);
//Now aPtr is the memory address 0x00000001
}
由于 bPtr 不包含有效的 A 对象,因此我希望dynamic_cast无法通过此转换,以便 aPtr 将变为 NULL。但这没有发生吗?哪一个是错误的,编译器(g++ 4.5.7)还是上面提到的网页?还是我错过了dynamic_cast实际上应该做什么?
编辑:答案摘要
- 在上层中,dynamic_cast什么都不做。没有任何形式的保证。
- 在向下投掷中,dynamic_cast 不会检查错误的指针。它假定源指针为 0 或指向有效的源对象。(如果给出错误的指针,则dynamic_cast操作可能会在向下转换期间出现段错误)
- 向下转换到dynamic_cast需要基类中至少有一个虚拟成员。
dynamic_cast<>
保证给出一个有效的对象,前提是它被正确使用。
使用此强制转换的第一个要求是具有多态基类(至少 1 个virtual
函数)。在您的示例中,A
和 B
不是多态的,这将导致编译错误。
第二个要求是dynamic_cast<>
应该用于向下转换,在您的情况下,您将其用于向上转换(这很容易发生)。
假设它们是多态的,那么第三个要求是在指向正确对象的指针/引用上使用此强制转换。
bPtr = (B*)0x0000001
不能保证引用B
的对象(主要是 UB)。
下面是正确的示例:
struct A{ virtual ~A() {} };
struct B : A {};
void main(){
A* pA = new B;
B* pB = dynamic_cast<B*>(pA);
}
相关文章:
- void() 是一个有效的C++表达式吗?
- C++14 : 2 个随机生成器 - 一个有效,另一个无效
- 仅当一个参数中未使用 std::function 时,模板函数替换才有效
- 使用 CMake 与其他静态库链接的静态库 - 一个有效,一个无效。为什么?
- 返回一个引用C++中另一个类对象的对象的有效方法
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- 如何有效地将(一些)项目从一个std::map移动到另一个std::map
- 如何有效地将一个大std::字符串的一部分转换为float
- 一个有效的图算法,满足以下条件
- 将一个数字拆分为多个数字,每个数字只有一个有效位
- 如何以更有效的方式检查一个数字是否是素数?
- 如果一个对象是在本地创建的,并在C++中作为异常抛出,那么本地对象如何在其范围之外有效,即在 catch 块中?
- 当字符串中只有一个"GOOD"字符串可用时,从没有空格的字符串中提取第一个单词的最佳和有效方法?
- C++:检查向量中的元素是否大于另一个具有相同索引的元素的有效方法?
- 这是一个有效的单例类吗?
- 给定一个创建的带有货物的链表,我需要使用函数检查实际序列或"train"是否有效
- C++,我正在尝试创建一个有效的.bmp输出文件
- 从另一个向量中搜索和找到元素的有效方法
- 尝试获取用户输入和cout消息期望,当我输入一个有效名称时,它将所有这些命名
- C - 一个函数声明,多个定义,并且仍然有效