Я уверен, что мы все видели код, который выходит из строя из-за ошибки, которая приводит к вызову чистой виртуальной функции. Один простой пример:
struct Base
{
Base() { method(); }
virtual void method() = 0;
};
struct Derived : Base
{
void method() {};
};
int main()
{
Derived d;
}
В этом случае вызов method()
в конструкторе Base
специально упоминается как поведение undefined в соответствии с разделом 10.4/6 стандарта С++, поэтому неудивительно, что мы закончили сбой. (Оба g++ и Clang предупреждают об этом, и на самом деле ссылка не работает с g++ с помощью этого примера, хотя Clang преуспевает.)
Но, просто для удовольствия, может ли кто-нибудь придумать способ вызвать чистую виртуальную функцию, которая не полагается на поведение undefined?
(я полагаю, вы могли бы утверждать, что если такой метод существует, то есть дефект в стандарте С++, но мне просто интересно...)
EDIT: Несколько ответов ребята и спасибо, но я должен был четко указать, что я понимаю, что законно делать не виртуальный вызов чистой виртуальной функции (где-то существует определение), Я больше задавался вопросом, есть ли какая-нибудь умная лазейка в законах, которая может привести к виртуальному вызову, и, скорее всего, к сбою в общем случае отсутствия определения.
Например, возможно, с помощью множественного наследования можно было бы сделать некоторые умные (законные) актеры, но в итоге получилось "неправильное" (не реализованное) PV method()
, подобное. Я просто подумал, что это забавный головоломщик: -)