考虑一个具有虚函数的类Base
和一个实现虚函数的Base的类Derived
,但只需要很少的私有成员。
我们可以安全地将Base*
指针转发到Derived*
指针吗?
Base* base = new Derived();
Derived* derived = dynamic_cast<Derived*>(base); // Is this valid?
如果派生类除了在基类中实现虚函数之外还包含一个额外的私有成员int _derivedNum,该怎么办?在向下转换基类指针后,我仍然可以使用derived-&gt; _derivedNum来访问派生类的私有成员吗?
答案 0 :(得分:1)
是的,你当然可以。强制转换是基于运行时类型标识的运行时函数。如果失败,则返回空指针。
答案 1 :(得分:1)
是的,我们可以安全地将Base *指针转发给Derived *指针。
Base* base = new Derived();
Derived* derived;
//Null is returned, if the cast is not safe
if( (derived = dynamic_cast<Derived *>(base)) != NULL)
{
//cast ok, can call methods of derived class
}
答案 2 :(得分:0)
有一个小附带条件,是的,这正是构建dynamic_cast
的原因。
附带条件是,您的广告需要转到pointer to Derived
,而不仅仅是Derived
:
Derived* derived = dynamic_cast<Derived *>(base);
但dynamic_cast
的基本观点是它首先检查指针对象是否真的是派生类型,然后返回指向它的指针,如果指针对象实际上不是,则返回空指针(或来自)所请求的目标类型。
另请注意,要使其工作,基类需要包含至少一个虚函数(但如果它不包含任何虚函数,则可能不打算用作无论如何基类。有例外(例如,std::iterator
)但它们是例外,而不是一般规则。