Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2011, 19:56   #1
ser70
Форумчанин
 
Аватар для ser70
 
Регистрация: 02.10.2009
Сообщений: 255
Восклицание Указатели на виртуальные функции-члены

Почему не работает код:
#include <iostream>
using namespace std;

class Mammal
{
public:
Mammal():itsAge(1){ }
virtual ~Mammal(){ }
virtual void Speak() const=0;
virtual void Move() const=0;
protected:
int itsAge;
};

class Dog: public Mammal
{
public:
void Speak() const{cout << "Woof!" << endl;}
void Move() const{cout << "Walking to heel..." << endl;}
};

class Cat: public Mammal
{
public:
void Speak() const{cout << "Meow!" << endl;}
void Move() const{cout << "slinking..." << endl;}
};

class Horse: public Mammal
{
public:
void Speak() const{cout << "Whinny!" << endl;}
void Move() const{cout << "Galloping..." << endl;}
};

int main()
{
void (Mammal::*pFunc)()const=0;
Mammal * ptr=0;
int Animal;
int Method;
bool fQuit=false;

while(fQuit==false)
{
cout << "(0)Quit (1)dog (2)cat (3)horse: ";
cin >> Animal;
switch(Animal)
{
case 1: ptr=new Dog; break;
case 2: ptr=new Cat; break;
case 3: ptr=new Horse; break;
default: fQuit=true; break;
}
if(fQuit)
break;

cout << "(1)Speak (2)Move: ";
cin >> Method;
switch(Method)
{
case 1: pFunc=Mammal::Speak; break;
default: pFunc=Mammal::Move; break;
}

(ptr->*pFunc)();
delete ptr;
}
}

Выдаёт такие ошибки:
program122.cpp: В функции ‘int main()’:
program122.cpp:63:22: ошибка: некорректное использование нестатической функции-элемента ‘virtual void Mammal::Speak() const’
program122.cpp:64:23: ошибка: некорректное использование нестатической функции-элемента ‘virtual void Mammal::Move() const’:coo l:
"Реальность воображаема, а воображаемое - реально" В. Соло
ser70 вне форума Ответить с цитированием
Старый 06.05.2011, 20:36   #2
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Сейчас работает.

Код:
#include <iostream>
using namespace std;

class Mammal
{
public:
   Mammal():itsAge(1){ }
   virtual ~Mammal(){ }
   virtual void Speak() const=0;
   virtual void Move() const=0;
protected:
   int itsAge;
};

class Dog: public Mammal {
public:
   void Speak() const{cout << "Woof!" << endl;}
   void Move() const{cout << "Walking to heel..." << endl;}
};

class Cat: public Mammal {
public:
   void Speak() const{cout << "Meow!" << endl;}
   void Move() const{cout << "slinking..." << endl;}
};

class Horse: public Mammal {
public:
   void Speak() const{cout << "Whinny!" << endl;}
   void Move() const{cout << "Galloping..." << endl;}
};

int main() {
   void (Mammal::*pFunc)()const=0;
   Mammal * ptr=0;
   int Animal;
   int Method;
   bool fQuit=false;

   while(fQuit==false) {
      cout << "(0)Quit (1)dog (2)cat (3)horse: ";
      cin >> Animal;
      switch(Animal) {
         case 1:
            ptr=new Dog;
            break;
         case 2:
            ptr=new Cat;
            break;
         case 3:
            ptr=new Horse;
            break;
         default:
            fQuit=true;
            break;
      }

      if(fQuit)
         break;

      cout << "(1)Speak (2)Move: ";
      cin >> Method;
      switch(Method) {
         case 1:
            pFunc=&Mammal::Speak;
            break;
         default:
            pFunc=&Mammal::Move;
            break;
      }

      (ptr->*pFunc)();
      delete ptr;
   }
}
P.S. Выравнивайте код, так приятней читать.
8Observer8 вне форума Ответить с цитированием
Старый 07.05.2011, 09:14   #3
ser70
Форумчанин
 
Аватар для ser70
 
Регистрация: 02.10.2009
Сообщений: 255
По умолчанию

Да, все заработало, но у меня ещё один вопрос, почему тогда знак амперсанда не нужен в случаи кода создаётся ссылка на функцию.
Например:
long Func(int);
{
}

long(*pFunc)(int);

pFunc=Func;
"Реальность воображаема, а воображаемое - реально" В. Соло
ser70 вне форума Ответить с цитированием
Старый 07.05.2011, 10:23   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Имя функции, имя массива, имя объекта... фактически являются указателями на...
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Виртуальные функции-операции и friend'ы megachuhancer Общие вопросы C/C++ 5 11.03.2011 15:38
ВИРТУАЛЬНЫЕ ФУНКЦИИ в Delphi MaxMad Помощь студентам 0 30.05.2010 20:06
Виртуальные функции bigory Помощь студентам 2 06.06.2009 22:44
НАСЛЕДОВАНИЕ И ВИРТУАЛЬНЫЕ ФУНКЦИИ С++ ermac52 Помощь студентам 1 05.06.2009 11:03
Одиночное наследование Виртуальные функции Brunette Помощь студентам 3 08.05.2008 19:23