2

有人可以帮我确定我哪里出错了吗?我正在尝试使用指向基类函数的函数指针

错误 C2064:术语不计算为在第 30 行上采用 0 个参数的函数,即 *(app)()

#include<stdio.h>
#include<conio.h>
#include<stdarg.h>
#include<typeinfo>

using namespace std;

class A{
public:
    int a(){
        printf("A");
        return 0;
    }
};

class B : public A{
public:
    int b(){
        printf("B");
        return 0;
    }
};

class C : public B{
public:
    int(C::*app)();
    int c(){
        app =&C::a;
        printf("%s",typeid(app).name());
        *(app)();
        printf("C");
        return 0;
    }
};
int main(){
    C *obj = new C();
    obj->c();
    getch();
}
4

4 回答 4

3

调用成员函数的指针时必须使用 .* 或 ->*

    class C : public B{
    public:
        int(C::*app)();
        int c(){
            app =&C::a;
            printf("%s",typeid(app).name());
            (this->*app)(); // use ->* operator within ()
            printf("C");
            return 0;
        }
    };
于 2013-04-04T07:10:15.143 回答
2

指向成员的指针必须始终与指向对象的指针/引用结合使用。你可能打算这样写:

(this->*app)();
于 2013-04-04T07:07:21.027 回答
1

http://msdn.microsoft.com/en-us/library/k8336763.aspx

二元运算符 –>* 将其第一个操作数(必须是指向类类型对象的指针)与其第二个操作数(必须是指向成员类型的指针)组合在一起。

所以这将解决你的问题:

class C : public B {
    public:
        int(C::*app)();

        int c() {
            app = &C::a;
            printf("%s", typeid(app).name());
            (this->*app)();
            printf("C");
            return 0;
        }
};
于 2013-04-04T07:18:14.660 回答
0

我有一种预感,您真正想要解决的问题是“如何从派生类调用基类函数?” 如果是这样的话,答案是:

int c(){
    app =&C::a;
    printf("%s",typeid(app).name());
    A::a(); //A:: scopes the function that's being called
    printf("C");
    return 0;
}

或者

int c(){
    app =&C::a;
    printf("%s",typeid(app).name());
    this->a();
    printf("C");
    return 0;
}
于 2013-04-04T07:12:21.317 回答