static_cast 和 dynamic_cast 在特定场景中的不同行为
different behavior of static_cast and dynamic_cast in a specific scenario
在以下情况下,我不明白 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;
}
Output:
Successfully Build and Compiled!
**///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;
}
Output:
main.cpp: In function 'int main(int, char**)': main.cpp:26:34: error:
cannot dynamic_cast 'f' (of type 'class Foo*') to type 'class Bar*'
(source type is not polymorphic)
Bar* b = dynamic_cast(f);
如果有人能帮助我理解这一点,我将不胜感激!
提示在
部分
(source type is not polymorphic)
这意味着,要使 dynamic_cast
工作,它需要一个多态基础 class,即有一个虚拟方法
class Foo {
public:
virtual ~Foo() {}
};
除此之外,它不会起作用,因为 f
没有指向 Bar
对象。在这种情况下,dynamic_cast
将 return 为 nullptr,您必须检查
Foo* f = new Foo;
Bar* b = dynamic_cast<Bar*>(f);
if (b != nullptr)
b->func();
在以下情况下,我不明白 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;
}
Output:
Successfully Build and Compiled!
**///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;
}
Output:
main.cpp: In function 'int main(int, char**)': main.cpp:26:34: error: cannot dynamic_cast 'f' (of type 'class Foo*') to type 'class Bar*' (source type is not polymorphic) Bar* b = dynamic_cast(f);
如果有人能帮助我理解这一点,我将不胜感激!
提示在
部分(source type is not polymorphic)
这意味着,要使 dynamic_cast
工作,它需要一个多态基础 class,即有一个虚拟方法
class Foo {
public:
virtual ~Foo() {}
};
除此之外,它不会起作用,因为 f
没有指向 Bar
对象。在这种情况下,dynamic_cast
将 return 为 nullptr,您必须检查
Foo* f = new Foo;
Bar* b = dynamic_cast<Bar*>(f);
if (b != nullptr)
b->func();