Подклассы как аргументы? - PullRequest
0 голосов
/ 27 февраля 2011

Я пытаюсь создать что-то вроде этого:

class food
{
public:
   void EAT(); //Whatever happens...
   int bitesLeft //This is decreased by one each time you eat the food
};

class cheese: public food
{
public:
   void EAT(); //Some overloaded form of the "eat" command... 
};

Есть ли способ создать один из них во время выполнения и иметь функцию, которая может принимать любой из них в качестве аргументов, не облажая переменную bitesLeft каждого из них?

Ответы [ 3 ]

2 голосов
/ 27 февраля 2011

Я предполагаю, что вы хотите что-то вроде:

function doStuff(food * f) {
    f->EAT();
}

И вы хотите, чтобы это вызывало специализированную EAT, если передан сыр, или неспециализированную форму, если foodВ этом случае вам нужна виртуальная функция:

class food {
  public:
    virtual void EAT();
    virtual ~food(); // Any class being used polymorphically should have
                     // a virtual destructor
}

class cheese : public food {
  public:
    virtual void EAT();
}

Я не совсем уверен, что вы имеете в виду, не облажая переменную bytesLeft.Это открытый элемент данных, поэтому любой код может изменить значение переменной так, как вы этого не ожидали.Сюда входит код в классе cheese, но также и код, которого нет ни в одном из классов.

Если вы хотите запретить изменению члена bitesLeft в коде метода cheese.EAT, вам следует объявитьэто как private в базовом классе.

0 голосов
/ 27 февраля 2011

Да, есть:

void myfunc(food* f)
{
    f->EAT();
}

int main()
{
    food f;
    cheese c;
    myfunc(&f);
    myfunc(&c);
    return 0;
}

Однако, чтобы это работало, вам нужно объявить EAT () как виртуальный в классе еды, как в virtual void EAT();. Кроме того, вы, вероятно, захотите объявить bitesLeft защищенным, чтобы к нему мог обращаться только сам класс и подклассы.

0 голосов
/ 27 февраля 2011

Переменные-члены двух объектов являются отдельными. Этот код работает так, как вы ожидаете:

void AFunction( food& x ) {
  x.EAT();
}

food a;
a.bitesLeft = 10;
cheese b;
b.bitesLeft = 5;

AFunction(a);   // a.bitesLeft --> 9
AFunction(b);   // b.bitesLeft --> 4
...