Как решить «чисто виртуальный метод называется»

Я понимаю, почему это происходит, но я застрял, пытаясь ее решить ... вот что делает мой код, когда генерируется ошибка (таким образом, приводит к сбою), когда моя программа завершает работу ...

pure virtual method called

SomeClass::~SomeClass()
{
   BaseClassObject->SomePureVirtualMethod(this);
}
void DerivedClass::SomePureVirtualMethod(SomeClass* obj)
{
    //Do stuff to remove obj from a collection
}

У меня никогда не было звонкаnew SomeClass но у меня естьQList<SomeClass*> который я добавляюSomeClass* возражает против. Цель этого деструктора вSomeClass это сказатьDerivedClass чтобы удалить конкретный экземплярSomeClass из своей коллекцииQList<SomeClass*>.

Так, в конкретном примере ...

BaseClass = Shape

DerivedClass = Triangle

SomeClass = ShapeProperties которому принадлежит ссылка наShape

Так, у меня никогда не было звонкаnew ShapeProperties но у меня естьQList<ShapeProperties*> ВнутриTriangle. Деструктор вShapeProperties это сказатьTriangle чтобы удалить определенное свойствоShapeProperties из своей коллекцииQList<ShapeProperties*>.

Ответы на вопрос(2)

Решение Вопроса

уже был вызван. Внутри конструкторов и деструкторов динамический тип объекта может фактически рассматриваться как статический тип. То есть, когда вы вызываете виртуальные методы из ваших конструкторов / деструкторов, вызываются не переопределенные версии.

ЕслиSomePureVirtualMethod должен вызываться в деструкторе, тогда вам придется вызывать его в деструкторе класса, где находится фактическое определение нужного вам метода.

 user86952522 мая 2012 г., 20:40
Я, наверное, неправильно понял: "ЕслиSomePureVirtualMethod должен вызываться в деструкторе, тогда вам придется вызывать его в деструкторе класса, где находится фактическое определение нужного вам метода. "
 user86952522 мая 2012 г., 21:22
Да, я понимаю это, но это не решает мою проблему, так как я нахожусь вSomeClass, неBaseClass ниDerivedClass.SomeClass владеет экземпляромBaseClass а такжеDerivedClass владеетlist ofSomeClass. Деструктор вSomeClass необходимо удалить экземплярSomeClass отlist ВнутриDerivedClass.
 K-ballo22 мая 2012 г., 20:42
@ user869525: Проще говоря, ваш призыв кSomePureVirtualMethod из деструктора не преобразуется в наиболее производное переопределение. Если вы хотите вызвать самое производное переопределение, вы должны вызвать его из деструктора класса, который реализует такое переопределение.
 K-ballo22 мая 2012 г., 20:32
@ user869525: Не могли бы вы перефразировать это? Я не понимал..
 user86952522 мая 2012 г., 20:29
Тогда как я узнаю, какой экземплярthis Я имею в виду, если я вызову его в производном конструкторе?

virtual метод в деструкторе Базового классаSomeClass это вызывает метод SomePureVirtualMethod()) Базового классаSomeClass, который является чисто виртуальным методом без определения. И, следовательно, ошибка.

Почему это происходит?
Типthis in конструктор или деструктор относится к типу, чей конструктор или деструктор вызывается, и, следовательно, динамическая диспетчеризация не работает в конструкторах и деструкторах, как вы ожидаете, что она будет работать во всех других функциях.

Почему происходит сбой?
Потому что вызов чистой виртуальной функции из конструктора или деструктора является Неопределенное поведение.

C ++ 03 10,4 / 6 штатов

"Функции-члены могут вызываться из конструктора (или деструктора) абстрактного класса; эффект от виртуального вызова (10.3) чистой виртуальной функции прямо или косвенно для объекта, создаваемого (или уничтожаемого) из такого конструктора (или деструктор) не определено. "

Как этого избежать?
Просто убедитесь, что вы не вызываете чисто виртуальную функцию из конструктора или деструктора.
Не звониvirtual методы в конструкторе или деструкторе, если вы не понимаете их динамику.

Ваш ответ на вопрос