Вызов виртуальной функции из-за ошибки виртуального деструктора C ++ - PullRequest
0 голосов
/ 03 апреля 2020

Я получаю неразрешенный внешний символ при вызове виртуальной функции из виртуального деструктора.

#include <iostream>

class Animal {
public:
  virtual void Sound() = 0;

  virtual ~Animal() {
    this->Sound();
  }
};

class Dog : public Animal {
public:
  void Sound() override {
    printf("Woof!\n");
  }
};

class Cat : public Animal {
public:
  void Sound() override {
    printf("Meow!\n");
  }
};

int main() {
  Animal* dog = new Dog();
  Animal* cat = new Cat();

  dog->Sound();
  cat->Sound();

  delete dog;
  delete cat;

  system("pause");
  return 0;
}

Почему? Также я попытался отредактировать деструктор к этому:

  void Action() {
    this->Sound();
  }

  virtual ~Animal() {
    this->Action();
  }

Теперь код компилируется, но в деструкторе я получаю чистый вызов виртуальной функции. Как я могу решить это?

1 Ответ

2 голосов
/ 03 апреля 2020

К тому времени, когда вы вызываете деструктор Animal, производный класс (Dog / Cat) уже имеет вызываемый деструктор, поэтому он недопустим. Вызов Dog::sound() может привести к получению доступа к уничтоженным данным.

Таким образом, вызову деструктора не разрешен доступ к методам производного класса. Он пытается получить доступ к Animal::sound(), но он чисто виртуальный - отсюда и ошибка.

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