2

どこが間違っているのかを特定するのを手伝ってもらえますか? 基本クラス関数への関数ポインタを使用しようとしています

エラー C2064: term は、行番号 30、つまり *(app)() で 0 の引数を取る関数として評価されません

#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

二項演算子 –>* は、最初のオペランド (クラス型のオブジェクトへのポインターである必要があります) と、2 番目のオペランド (メンバーへのポインターである必要があります) を結合します。

したがって、これで問題が解決します:

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 に答える