【发布时间】:2014-12-10 15:50:12
【问题描述】:
clang 3.5.0 和 g++ 4.9.0 compile the following code fine(带有-std=c++11 -Wall -Wextra -pedantic-errors)和程序输出true:
#include <iostream>
struct A
{
virtual ~A() = default;
};
struct B
{
virtual ~B() = default;
};
struct C : A, B
{
virtual ~C() = default;
};
int main()
{
C c;
A* ap = &c;
B* bp = dynamic_cast<B*>(ap);
std::cout << std::boolalpha << (bp != nullptr) << std::endl;
}
【问题讨论】:
-
您是否有特殊原因怀疑您看到的行为可能是错误的? (无论哪种方式,这都是一个有效的问题,但它会影响一个好的答案应该关注什么。)
-
@hvd 我几乎可以肯定这是不可能的。我不知道为什么。 :)
-
@hvd 我的意思是我假设程序的输出应该是
false,当然,在某些情况下使用dynamic_cast可能是无效的。 -
请注意,这不会与
libc++链接。 -
只是添加一些关于这个场景的信息。如果“ap”是指向与 B 的层次结构无关的某个类的指针,则此 dynamic_cast 将返回 null 并且您必须在取消引用之前检查“bp”是否为 NULL。另一种方法是使用带有 dynamic_cast 的引用:
B* bp = nullptr; try{ bp = &(dynamic_cast<B&>(*ap)); } catch (...) { std::cout << "exception" << std::endl; }
标签: c++ inheritance c++11 casting dynamic-cast