当前位置: 首页 > 知识库问答 >
问题:

c++ - dynamic_cast 向下转型时报错?

甄文彬
2023-12-09

这段代码是直接从文章中复制下来的

#include <iostream>using namespace std;int main(int argc, char const *argv[]){  // 动态转换  class Base {};  class Derived: public Base {};  Base* ptr_base = new Derived;  Derived* ptr_derived = dynamic_cast<Derived*>(ptr_base);  return 0;}

但是会报 运行时 dynamic_cast 的操作数必须包含多态类类型的错误,运行时也会报错

我的理解是这段代码在进行向下转型,应该是没有问题的。

共有2个答案

卫博学
2023-12-09

错误信息本身已经说的非常明确了:

运行时 dynamic_cast 的操作数必须包含多态类类型

多态类类型必须包含至少一个虚函数。

裘嘉木
2023-12-09

这段代码在编译时出现错误,原因是在 dynamic_cast 中使用的类型没有多态(也就是没有虚函数)。在C++中,dynamic_cast 是一个运算符,用于在运行时检查和转换对象类型。它通常用于类层次结构中基类和派生类之间的类型转换。然而,这个转换只能应用于具有虚函数的类,这是因为 dynamic_cast 需要运行时类型信息(RTTI)来检查和转换类型。

在你的代码中,BaseDerived 类都没有定义虚函数,因此当你尝试使用 dynamic_cast 对其进行类型转换时,编译器会报错,因为它找不到需要 RTTI 的地方。

要解决这个问题,你需要在 Base 类中至少定义一个虚函数。例如:

#include <iostream>using namespace std;class Base {public:    virtual ~Base() {}  // 定义一个虚析构函数};class Derived: public Base {public:    void print() {        cout << "Derived class" << endl;    }};int main(int argc, char const *argv[]) {  // 动态转换  Base* ptr_base = new Derived;  Derived* ptr_derived = dynamic_cast<Derived*>(ptr_base);  if (ptr_derived) {      ptr_derived->print();  } else {      cout << "dynamic_cast failed" << endl;  }  delete ptr_base;  return 0;}

在这个修改后的代码中,我们为 Base 类添加了一个虚析构函数。这使得 Base 类成为了一个多态类,因此 dynamic_cast 现在可以正确地运行和转换类型。注意,如果你希望使用 dynamic_cast 进行向上转型(也就是将派生类的指针转换为基类的指针),你需要确保基类有一个虚构造函数。这是因为 dynamic_cast 在运行时会调用构造函数来创建新的对象。

 类似资料:
  • 主要内容:将派生类对象赋值给基类对象,将派生类指针赋值给基类指针,将派生类引用赋值给基类引用在 C/ C++ 中经常会发生数据类型的转换,例如将 int 类型的数据赋值给 float 类型的变量时,编译器会先把 int 类型的数据转换为 float 类型再赋值;反过来,float 类型的数据在经过类型转换后也可以赋值给 int 类型的变量。 数据类型转换的前提是,编译器知道如何对数据进行取舍。例如: 输出结果为 10,编译器会将小数部分直接丢掉(不是四舍五入)。再如: 输出结果为 10.

  • 本文向大家介绍Java 向上转型和向下转型的详解,包括了Java 向上转型和向下转型的详解的使用技巧和注意事项,需要的朋友参考一下  Java 向上转型和向下转型的详解 转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展。 向上转型:子类引用的对象转换为父类类型称为向上转型。通

  • 本文向大家介绍Java 转型(向上或向下转型)详解及简单实例,包括了Java 转型(向上或向下转型)详解及简单实例的使用技巧和注意事项,需要的朋友参考一下 在Java编程中经常碰到类型转换,对象类型转换主要包括向上转型和向下转型。 向上转型 我们在现实中常常这样说:这个人会唱歌。在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说我们更倾向于使用抽象概念“人”。再例如,麻雀是鸟类的一

  • 本文向大家介绍浅谈Java向下转型的意义,包括了浅谈Java向下转型的意义的使用技巧和注意事项,需要的朋友参考一下 一开始学习 Java 时不重视向下转型。一直搞不清楚向下转型的意义和用途,不清楚其实就是不会,那开发的过程肯定也想不到用向下转型。 其实向上转型和向下转型都是很重要的,可能我们平时见向上转型多一点,向上转型也比较好理解。 但是向下转型,会不会觉得很傻,我是要用子类实例对象,先是生成子

  • 下表列出了关键的区别 #include <stdio.h> -> import cstdlib.stdio; #define A 1 -> const A = 1 #define W(cond) while(cond) -> (不支持) char

  • 对每个人来说,习惯C++需要一些时间,对于已经熟悉C的程序员来说,这个过程尤其令人苦恼。因为C是C++的子集,所有的C的技术都可以继续使用,但很多用起来又不太合适。例如,C++程序员会认为指针的指针看起来很古怪,他们会问:为什么不用指针的引用来代替呢? C是一种简单的语言。它真正提供的只有有宏、指针、结构、数组和函数。不管什么问题,C都靠宏、指针、结构、数组和函数来解决。而C++不是这样。宏、指针