2

我通过参数将(A 类)的 2 个指针传递给它的派生类(B 类)。

其中一个指针必须属于 B 类,以便我可以调用在 B 中声明的方法。

我该怎么做?

静态演员不是只能让您以相反的方式进行吗?(B 被动态转换为类型 A)。我被告知不要做 c 风格的演员表。重新解释演员表可能很危险?

我能想到的唯一另一个是静态演员表。那是我在这里需要的吗?

谢谢

4

2 回答 2

3

您可以使用static_castdynamic_cast用于此目的。两者之间的区别在于,dynamic_cast它将在运行时检查指针是否实际指向派生类的对象(这要求基类中至少有一个virtual成员函数(包括析构函数))。如果您可以确定演员表是可能的,那么static_cast将在没有运行时检查的情况下进行。

语法是:

B* p_b = static_cast< B* >( p_a );

// or:

B* p_b = dynamic_cast< B* >( p_a );
于 2013-05-04T02:53:24.610 回答
3

通常,您希望通过仅使用virtual基中声明的成员函数来避免此类情况。如果必须强制转换指向派生类的指针,请确保基类至少具有一个virtual函数(任何函数或析构函数都足够了),然后使用dynamic_cast<T>

BaseClass *bp = new DerivedClass();
...
DerivedClass *dp = dynamic_cast<DerivedClass*>(bp);
if (!dp) {
    cerr << "Not a derived class!" << endl;
}

如果bp指向 a DerivedClass,则动态转换成功;否则,它会失败,并返回一个空指针。

您可能需要使用特殊标志进行编译以启用 RTTI 支持。

于 2013-05-04T02:54:49.043 回答