动态的好处/用处是什么?
这个问题在这里已经有了答案:
如果你不使用强制转换,那么非虚拟成员函数就会调用Base方法。 以下代码显示了虚函数和非虚函数之间的区别,以及动态转换后会发生什么。
class Base
{
public:
void print2() {
cout << "Base" << endl;
}
virtual void print() {
cout << "Base" << endl;
}
};
class Derived : public Base
{
public:
void print2() {
cout << "Derived" << endl;
}
virtual void print() {
cout << "Derived" << endl;
}
};
int main()
{
Base* ptrb1 = new Base();
//it will print Base
ptrb1->print();
ptrb1->print2();
Base* ptrb2 = new Derived();
// it will print Derived
ptrb2->print();
ptrb2->print2();
Derived* ptrd = NULL;
//what is the difference between 2ways?
//what is the benefit of useing dynamic_cast?
ptrd = dynamic_cast<Derived*>( ptrb2 );
ptrd->print();
ptrd->print2();
}
如果您要使用static_cast
(因为您可能倾向于认为在重新投射指针时可以这样做),那么仍然从Base派生的另一个类将被错误地转换。 dynamic_cast
会显示转换不可能并返回nullptr
。
尽可能使用这种虚拟功能。
使用dynamic_cast
如果:
dynamic_cast
提供基于运行时类型信息的子类检查,回答这个问题:
这是特定派生类型的基类对象吗?
如果答案是肯定的(投票成功),那么我们可以使用该对象作为其派生类型,否则我们不能。
如果没有运行时类型信息和dynamic_cast
,C ++程序员将不得不将自己的ad-hoc类型测试合并在一起来完成同样的任务。
为什么有时候需要一个明确的类型检查,就是需要做一些特定于子类型的小动作,并且你不想为虚拟方法引入繁琐的形式化方法。
其他强制转换(如static_cast
与dynamic_cast
不同之处在于,它们不会进行运行时类型检查,并且不会失败:如果强制进行无意义的转换,它们可能会生成虚假结果。