Определение pure virtual function

131
26 апреля 2019, 08:10

Недавно обнаружил, что можно дать определение для pure virtual function вне класса:

struct Abstract {
    virtual void foo() = 0;
};
void Abstract::foo() { std::cout << "Abstract"; }

Является ли такой способ соответствующим стандарту? Можно ли как-то вызвать эту функцию (из наследника или какими-то кастами)?

Answer 1

Является. Можно.

Такую функцию можно вызвать при помощи квалифицированного имени

struct Derived : Abstract {
  virtual void foo() { std::cout << "Derived"; }
};
...
Derived *p = new Derived;
p->Abstract::foo();
Derived d;
d.Abstract::foo();

Точно так же, через квалифицированное имя вы вызываете функции базового класса из одноименных функций классов-наследников (только не обязательно указывая часть this->)

struct Derived : Abstract {
  virtual void foo() {  
    Abstract::foo(); // то же что и `this->Abstract::foo();`
    std::cout << "Derived"; 
  }
};

Также, эквивалентным образом неявно вызываются деструкторы базовых классов из деструкторов классов-наследников. Это означает, что всякий раз, когда вы объявляете деструктор как pure virtual, вам все равно придется предоставить для него определение.

READ ALSO
How to sort Map by Key, but with two conditions in Java?

How to sort Map by Key, but with two conditions in Java?

У меня есть проблема в сортировке MapИмеется LinkedHashMap с ключами типа "September-2018", "October-2018", "November-2017", "November-2018"

121
Что в Java является константой, а что - нет?

Что в Java является константой, а что - нет?

До недавнего времени я был почти на 100% убеждён в том, что прекрасно понимаю сущность констант в языке программирования JavaТак было, пока я не наткнулся...

120
Тестирование исключений

Тестирование исключений

У меня имеется метод:

165