2013-04-04 27 views
2

有人可以幫助我確定哪裏出錯了嗎?我想使用函數指針的基類功能指向基類錯誤的成員函數

錯誤C2064:術語不計算爲取0參數上線人數30即*(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(); 
} 
+2

嘗試'(本 - > *應用程序)();' – WhozCraig 2013-04-04 07:06:42

+1

爲什麼你試圖用一個指針的基類的功能?有沒有什麼特別的原因,你不能只調用'A :: a();'? – maditya 2013-04-04 07:08:47

+0

@WhozCraig非常感謝!知道了 – 2013-04-04 07:11:24

回答

2

指針的函數成員必須始終與對象的指針/引用結合使用。你大概意思寫:

(this->*app)(); 
+0

非常感謝!它的工作原理 – 2013-04-04 09:59:18

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; 
     } 
    }; 
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; 
} 
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; 
     } 
}; 
+0

對不起,當我搜索併發布答案時,其他人已經比我快。我必須知道我處於stackoverflow的世界! – 2013-04-04 07:24:20