这里向您展示我的意思,没有代码很难描述:
class Object
{
// attributes..
};
class Attribute
{
public:
void myfunc();
};
class Character: public Object, public Attribute
{
};
void main()
{
Object* ch = new Character;
// How can I call the myfunc() from Attribute
// tried static_cast<Attribute*>(ch);
}
我只有一个Object Class指针,我不知道 如果它是一个字符对象或继承自的对象 属性类,我所知道的是该类继承自Attribute Class。
答案 0 :(得分:3)
交叉投射只能通过dynamic_cast来完成。
Object * o = new Character;
Attribute * a = dynamic_cast<Attribute*>(o);
if (!a) throw_a_fit();
a->myfunc();
但是,要使其工作,您必须具有多态基类(它们必须至少具有一个虚函数)。
答案 1 :(得分:2)
如果你知道你有一个正确类型的对象,你可以明确地转换:
Object * ch = /* something that's a Character */
static_cast<Attribute *>(static_cast<Character *>(ch))->myfunc();
如果ch
指向的派生程度最高的对象的类型不是Attribute
的子类型,显然这是不正确的。
如果您的类层次结构是多态的(即在您关心的每个基类中至少有一个虚函数),那么您可以在运行时直接使用dynamic_cast
并检查它是否成功,但这是相对的昂贵的操作。相比之下,静态强制转换根本不会产生任何运行时成本。