Связь между указателем и наследованием c ++ oop - PullRequest
0 голосов
/ 10 октября 2018

Может ли кто-нибудь выразить краткий код c ++, который должен показать связь между указателем и наследованием.

Я считаю, что приведенный ниже код относится к моей проблеме

class Animal { 
  public:   
    virtual void MakeSound(const char* pNoise) { ... }   
    virtual void MakeSound() { ... } 
};

class Dog : public Animal { 
  public:   
    virtual void MakeSound() {... }
};

int main() {   
  Animal* a = new Dog();   
  Dog* d = new Dog();  
  a->MakeSound("bark");   
  d->MakeSound("bark"); // Does not compile  
  return 0; 
}

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Вы скрываете базовый класс MakeSound с переопределением других MakeSound, поэтому он не участвует в разрешении перегрузки.Либо переопределите оба, либо ни один из них в Dog или переименуйте одно из них в MakeNoise.

0 голосов
/ 10 октября 2018

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

И обратите внимание, что в вашем примере нет особого смысла для виртуальной пустоты make_sound (char const *), гораздо более распространенным было бы использование виртуальной формы void make_sound (), а производный тип знаеткакой звук производить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...