我在下面的场景中没有弄清楚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'(类型'类Foo *')键入'class Bar *' (源类型不是多态的) Bar * b = dynamic_cast(f);
如果有人能帮助我理解这一点,我将不胜感激!
答案 0 :(得分:6)
提示位于
部分(源类型不是多态的)
这意味着,为dynamic_cast
工作,它需要一个多态基类,即有一个虚方法
class Foo {
public:
virtual ~Foo() {}
};
除此之外,它不起作用,因为f
没有指向Bar
对象。在这种情况下,dynamic_cast
将返回nullptr,您必须检查
Foo* f = new Foo;
Bar* b = dynamic_cast<Bar*>(f);
if (b != nullptr)
b->func();