1

考虑一个Base具有虚函数的类和一个Derived来自 Base 的实现虚函数的类,但几乎没有额外的私有成员。我们可以安全地将指针向下转换Base*Derived*指针吗?

Base* base = new Derived();

Derived* derived = dynamic_cast<Derived*>(base); // Is this valid?

如果派生类除了在基类中实现虚函数之外还包含一个额外的私有成员 int _derivedNum 怎么办?向下转换基类指针后,我还能使用derived->_derivedNum 访问派生类的私有成员吗?

4

3 回答 3

1

是的,你当然可以。cast 是一个运行时函数,基于运行时类型标识。如果失败,则返回一个空指针。

于 2013-04-27T02:48:13.163 回答
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
}
于 2013-04-27T02:57:52.500 回答
0

有一个小附带条件,是的,这正是dynamic_cast构建的目的。

附带条件是你的演员需要是pointer to Derived而不是仅仅Derived

Derived* derived = dynamic_cast<Derived *>(base);

但基本点dynamic_cast是它首先检查指针对象是否真的是派生类型,然后返回指向它的指针,或者如果指针对象实际上不是(或派生自)请求的对象,则返回空指针目标类型。

另请注意,要使其正常工作,基类至少需要包含一个虚函数(尽管如果它不包含任何虚函数,则它可能无论如何都不打算用作基类。但也有例外(例如,std::iterator) 但它们是例外,而不是一般规则。

于 2013-04-27T02:46:12.140 回答