Используя C ++, как вызвать метод базового класса из метода производного класса и применить его к объекту, переданному в качестве аргумента? - PullRequest
0 голосов
/ 22 марта 2012

Я не могу понять, как вызвать метод базового класса из метода производного класса, но одновременно применяю этот вызов метода к объекту, переданному в качестве аргумента.

Что я имею в виду, это:

class Animal
{ 
    virtual void eat(Animal& to_be_eaten) = 0;
 };

class Carnivores: public Animal
{ 
    virtual void eat(Animal& to_be_eaten) { /*implementation here*/}

};

class Wolf : public Carnivores
{ 
    virtual void eat(Animal& to_be_eaten)
    { /*call eat method(of Base class) of Base to_be_eaten here*/ }
 }

Я думал о чем-то вроде этого

 dynamic_cast<Carnivores&>(to_be_eaten).eat(*this) //and got a segmentation fault

Есть ли способ сделать это?

Спасибо!

Новое редактирование :: Обновлен код

Ответы [ 2 ]

5 голосов
/ 22 марта 2012

Так же просто, как:

class Derived : public Base  {
    virtual void eat(Animal& to_be_eaten) { 
        Base::eat(to_be_eaten);
        // do anything you want with to_be_eaten here.
    }
};

РЕДАКТИРОВАТЬ : Это работает для меня:

class Animal
{ 
    virtual void eat(Animal& to_be_eaten) = 0;
 };

class Carnivores: public Animal
{ 
    virtual void eat(Animal& to_be_eaten) { /*implementation here*/}

};

class Wolf : public Carnivores
{ 
    virtual void eat(Animal& to_be_eaten)
    { 
        Carnivores *c = dynamic_cast<Carnivores*>(&to_be_eaten);
        if(c) 
            c->Carnivores::eat(*this);
    }
 }

Обратите внимание, что я должен был сделать Base::eat публичным, чтобы вызвать его с Derived.

0 голосов
/ 22 марта 2012

Если я правильно понимаю, вам не нужно использовать виртуальный вызов для объекта параметра (to_be_eaten).Я думаю, что только объект может сделать это для себя.Я не думаю, что у других объектов есть способ сделать это для него.

class Base
{
public:
  virtual eat(Base& to_be_eaten);
protected:
  virtual callEatNonVirtual(Base& other) = 0;
};

class Derived1 : public Base
{
public:
  virtual eat(Base& to_be_eaten)
  {
    to_be_eaten.callEatNonVirtual(*this);     
  }
protected:
  virtual callEatNonVirtual(Base& other)
  {
    Base::eat(other);
  } 
};

class Derived2 : public Base
{
public:
  virtual eat(Base& to_be_eaten)
  {
    to_be_eaten.callEatNonVirtual(*this);     
  }
protected:
  virtual callEatNonVirtual(Base& other)
  {
    Base::eat(other);
  } 
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...