2016-11-01 3 views
0

Можно ли с помощью смешной инициализации и/или отбрасывания базовым классам получить экземпляр абстрактного класса или класса, который имеет чистые виртуальные методы?Может ли компилятор VS C++ пропустить экземпляр абстрактного класса

Я использую компилятор VS14, и мне интересно, может ли компилятор пропустить это? Класс и его использование находятся в отдельных сборках.

Чтобы быть ясным, я не пытаюсь достичь этого, просто глядя на ошибки и задаваясь вопросом, может ли это привести к исключению во время выполнения вызова виртуального метода.

+1

... Вы уверены, что не имеете дело с проблемой [срезания] (http://stackoverflow.com/questions/274626/what-is-object-slicing)? Он * кажется * связан ... – jaggedSpire

+0

@jaggedSpire Вы не можете нарезать абстрактный класс, так как вы не можете создать экземпляр абстрактного класса. – Brian

+0

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

ответ

0

Если ваша программа содержит неопределенное поведение, все может произойти.

Но, в общем, нет, необычное кастинг не позволит вам создать полный объект абстрактного типа базового класса.

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

Смежные вопросы