我需要从类外部的某个对象上调用“声明”类型的函数。我做了一个小代码示例,并将所需的行为作为注释,因为我不知道如何问这个:)
template<typename T>
void hun(T* obj, class C* c)
{
//do some checking on c
if(some conditions from c are true)
{
//call fun from T ignoring it's virtual
}
}
struct A
{
virtual void fun(){};
virtual void gun(class C* c)
{
//do something specific to A
hun(this, c); //here call fun from A even if real type of this is B
};
}
struct B : public A
{
void fun(){};
void gun(class C* c)
{
//do something specific to B
hun(this, c);//here call fun from B even if real type of this is something derived from B
};
}
有可能实现这种行为吗?
我知道我可以使用fun()
或A::fun()
从课堂内拨打B::fun()
,但来自hun()
的检查对所有课程都很常见,我不想要使用此代码污染gun()
。
答案 0 :(得分:9)
(这可能已经在其他地方得到了回答..)
您可以使用qualified-id显式调用虚拟函数的一个覆盖。成员函数的限定id的格式为my_class::my_function
。
供参考,参见C ++ Standard [expr.call] / 1:
如果所选函数是非虚拟的,或者类中的id-expression 成员访问表达式是一个qualified-id,该函数被调用。否则,它的最终覆盖(10.3) 调用对象表达式的动态类型。
实施例
template<typename T>
void hun(T* obj, class C* c)
{
//do some checking on c
if(some conditions from c are true)
{
//call fun from T ignoring it's virtual
obj->T::fun(); // T::fun is a qualified-id
}
}
struct A
{
virtual void fun(){};
virtual void gun(class C* c)
{
//do something specific to A
hun(this, c); //here call fun from A even if real type of this is B
};
}; // note: semicolon was missing
struct B : public A
{
void fun(){};
void gun(class C* c)
{
//do something specific to B
hun(this, c);//here call fun from B even if real type of this is something derived from B
};
};