在铸造孩子时,有没有一种方法可以使用Dynamic_cast
Is There a way to use dynamic_cast When Casting to a Child?
说我有这些类:
struct Parent {};
struct Child : public Parent {
void func() {}
};
现在说我想创建这样的函数:
void foo(Parent* arg) {
auto child = dynamic_cast<Child*>(arg);
if(child != nullptr) child->func();
}
,但显然这显然会给我带来错误:
dynamic_cast
:Parent
不是多态类型
所以我不能执行dynamic_cast
步骤,有没有一种方法可以验证arg
实际上是在运行时是Child*
?
给您的Parent
类虚拟函数。出于几个原因,毁灭者想到了(例如通过基本PTR删除孩子等)。
不,你不能。您可以使用RTTI
(Run Time Type Information
)实现有关对象的信息。对象的RTTI
存储在其类的虚拟表中。
多态类别的每个对象(即具有一个或多个虚拟函数的类,或从多态类派生的类中的类)包含一个vptr
,这是指向相应类的虚拟表的指针。非造型类型的对象没有vptr
,并且没有一个虚拟表。因此,您不能在非造型类型上使用dynamic_cast
。
因此,正如@lorro所说,您应该向Parent
添加虚拟函数,最简单的选项是添加虚拟破坏者(无论如何您都应该这样做):
struct Parent {
virtual ~Parent() {}
};
相关文章:
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 有没有一种方法可以在编译时获得作用域类名
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 一种在C++中读取TXT配置文件的简单方法
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 在 c++ 中,有一种方法可以创建一个包含地图作为值的树状地图?
- 有没有一种优雅而快速的方法来测试整数中的 1 位是否位于连续区域
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 找到一种有效的方法,在 2 个巨大的缓冲区上执行 MAX,每字节字节
- 寻找一种更好的方法来表示无符号字符数组
- 有没有一种通用的方法来实现不变量
- 有没有一种方法可以捕获进程中的堆栈溢出?C++Linux
- 使用类在C++中存储和列出变量/方法是否是一种好的做法
- 一种从内存中删除 UTF 字节的方法?