Недавно обнаружил, что можно дать определение для pure virtual function
вне класса:
struct Abstract {
virtual void foo() = 0;
};
void Abstract::foo() { std::cout << "Abstract"; }
Является ли такой способ соответствующим стандарту? Можно ли как-то вызвать эту функцию (из наследника или какими-то кастами)?
Является. Можно.
Такую функцию можно вызвать при помощи квалифицированного имени
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, вам все равно придется предоставить для него определение.
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
У меня есть проблема в сортировке MapИмеется LinkedHashMap с ключами типа "September-2018", "October-2018", "November-2017", "November-2018"
До недавнего времени я был почти на 100% убеждён в том, что прекрасно понимаю сущность констант в языке программирования JavaТак было, пока я не наткнулся...