2

Может кто-нибудь, пожалуйста, помогите мне определить, где я иду не так? Я пытаюсь использовать функцию указатели на функции базового классаУказатель на функцию-член ошибки базового класса

ошибка C2064: термин не вычисляется функция, принимающая 0 аргументов на номер строки 30 т.е. * (приложение)()

#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

Try '(это -> * приложение)();' – WhozCraig

+1

Почему вы пытаетесь использовать указатель на функцию базового класса? Есть ли какая-то особая причина, по которой вы не можете просто называть 'A :: a();'? – maditya

+0

@WhozCraig Спасибо большое! получил это –

ответ

2

указателей на члены всегда должны использоваться в сочетании с указателем/ссылкой на объект. Вы, вероятно, имел в виду, чтобы написать это:

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

Спасибо большое! Это работает –

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! –

Смежные вопросы