相关疑难解决方法(0)

你可以合法地dynamic_cast到多态类的非多态基类

这个答案中,出现了以下情况:

#include <cassert>

struct A {};

struct B { virtual ~B(){} };

struct AA{};
template <class T>
struct C : A, T {};

int main()
{
  B * b = new C<B>;
  AA * aa = new C<AA>;
  assert(dynamic_cast<A*>(b));
  assert(dynamic_cast<A*>(aa)); //this line doesn't compile, as expected
}
Run Code Online (Sandbox Code Playgroud)

在g ++ 4.8.4(Ubuntu)上,这个编译并且断言传递.我的问题是,这真的合法吗?我觉得你根本不应该dynamic_cast参加一个非多态的课程,但我承认我不是这里发生的事情的专家.

当我尝试相反的方向时:

dynamic_cast<B*>((A*)(new C<B>));
Run Code Online (Sandbox Code Playgroud)

它无法编译,声明"源类型不是多态的".我觉得这是一个线索,但它仍然似乎是一个延伸,找到属于当前指针是基础的类的非多态基类(这个句子是否有意义?).

c++ polymorphism casting

16
推荐指数
1
解决办法
988
查看次数

标签 统计

c++ ×1

casting ×1

polymorphism ×1