【发布时间】:2017-01-12 17:20:28
【问题描述】:
#include <iostream>
class Base {
};
class Derived : public Base {
};
int main() {
Base* bptr = new Derived();
Derived* dptr = static_cast<Derived*>(bptr);
std::cout << dptr << std::endl;
}
在上面的代码中,我应该使用 dynamic_cast 但我正在使用 static_cast 不正确。永远不应该使用 static_cast while 向下转换,因为编译器无法确定我们在做什么 正确投射。
为什么这不是编译错误?我正在使用 gcc 4.9.2。你们有吗 认为这是编译器中的错误,还是 C++ 标准允许这样的代码?
编辑:感谢您的回复。实际上,上面的基类是多态的 即它有虚函数,但我在这个例子中忽略了它们。我应该 已经在 Base 中加入了一个虚拟析构函数,以表明它 是多态的——我的错。
【问题讨论】:
-
您可以将
static_cast从Base*更改为Derived*,但您是正确的,它不会执行任何类型检查。但是,如果您通过其他方式知道该指针确实指向Dervied对象,它仍然很有用。如果Base*实际上没有指向Derived*,那么由static_cast产生的任何对Derived*的解引用都会调用未定义的行为。 -
实际上,这正是
static_cast的用途;毕竟,对基类指针/引用的转换是隐式完成的。
标签: c++