6

我需要从类外的某个对象上调用“声明”类型的函数。我做了一个小代码示例并将所需的行为作为注释,因为我不知道如何问这个:)

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()or从类内部调用B::fun(),但是检查 fromhun()对于所有类都是常见的,我不想gun()用这段代码污染。

4

1 回答 1

10

(这可能已经在其他地方得到了回答..)

您可以使用限定 ID 显式调用虚拟函数的一个覆盖。成员函数的限定 ID 的格式为my_class::my_function

有关参考,请参阅 C++ 标准 [expr.call]/1:

如果选择的函数是非虚函数,或者类成员访问表达式中的 id-expression 是限定 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
    };
};
于 2013-04-27T14:40:15.833 回答