c++ - 为什么编译器会提示我的 dynamic_cast?

标签 c++ oop templates polymorphism dynamic-cast

<分区>

我想找出我的代码中编译错误的原因:

class A
{
    public:
    virtual ~A(){}
};

class B: public A
{
    public:
    virtual ~B(){}
};

class D: public B
{
    public:
    virtual ~D(){}
};

template <class X, class Y>
X* fun(X* p){return dynamic_cast<Y*>(p);}

int main()
{
    A* q = dynamic_cast<B*>(new D());
    A* p = fun<D,B>(new D());
}

在我看来,指针 q 和 p 应该指向相同的类型,但是对于 p,我收到一个编译器错误,提示“从‘B*’到‘D*’的无效转换”。我唯一没有收到错误的情况是当我以 B 是 D 的子类的方式更改类时(因此 p 是空指针)。谁能帮我理解为什么会这样?

最佳答案

template <class X, class Y>
X* fun(X* p){return dynamic_cast<Y*>(p);}

此函数接受一个 X* 并返回一个 X*

在正文中,您将其转换为 Y*。然后您尝试将其隐式转换为 X*

您遇到的错误是在 fun 的主体中,您在其中采用 D*,将其转换为 B*,然后再次尝试将其隐式转换为 D*。那失败了。因此你的错误。

在查看编译器错误时,它有助于

  1. 让每个语句单独占一行。如果语句很复杂,请将其分解为多个语句。

  2. 查看编译器提示错误的那一行。

解决办法是:

template <class X, class Y>
Y* fun(X* p){return dynamic_cast<Y*>(p);}

现在您的代码可以工作了。

关于c++ - 为什么编译器会提示我的 dynamic_cast?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54312740/

相关文章:

java - 需要创建一个只能从 G 实例化的 A 类

c++ - 将 STL 分配器与 STL vector 一起使用

c++ - 我怎样才能得到三个字符数的总和?

c++ - 如何使用常规构造函数模式初始化 C++ 11 标准容器?

c++ - 为什么在声明析构函数时必须声明复制和移动构造函数?

c++ - 结合CUDA 9和GCC4.3编译的C++软件

c++ - 如何使用带有除空格以外的其他分隔符的 istringstream 拆分字符串?

c++ - 为什么 C4265 Visual C++ 警告(虚拟成员函数和无虚拟析构函数)默认关闭?

php - OOP - 函数未定义?

c++ - 模板化检查是否存在类成员函数?