【发布时间】:2018-02-06 08:17:44
【问题描述】:
我不明白下面场景中 static_cast 和 dynamic_cast 的真正区别:
**///with static_cast///**
class Foo{};
class Bar: public Foo
{
public:
void func()
{
return;
}
};
int main(int argc, char** argv)
{
Foo* f = new Foo;
Bar* b = static_cast<Bar*>(f);
b->func();
return 0;
}
输出:
编译成功!
**///with dynamic_cast///**
class Foo{};
class Bar: public Foo
{
public:
void func()
{
return;
}
};
int main(int argc, char** argv)
{
Foo* f = new Foo;
Bar* b = dynamic_cast<Bar*>(f);
b->func();
return 0;
}
输出:
main.cpp: 在函数'int main(int, char**)': main.cpp:26:34: 错误: 不能 dynamic_cast 'f'(类型为 'class Foo*')输入 'class Bar*' (源类型不是多态的) Bar* b = dynamic_cast(f);
如果有人能帮助我理解这一点,我将不胜感激!
【问题讨论】:
-
当第一个构建和运行时,它会导致未定义的行为,因为
f(因此b)不是指向Bar的指针对象。 -
至于
dynamic_cast,this reference应该会有所帮助。 -
您不能将指向基类对象的指针转换为派生类指针。
dynamic_cast(如果是虚拟成员)将返回nullptr。static_cast将编译但使用此类指针将导致未定义的行为。 -
@DanielLangr 这种强制转换本身是未定义的行为。
标签: c++ oop inheritance dynamic-cast static-cast