воскресенье, мая 22, 2005

Как вызвать чисто виртуальную функцию без тела

Чисто виртуальная функция без тела не должна быть вызвана никогда. Это теоретически. Но при очень большом желании ее таки можно вызвать.
В случае чисто виртуальной функции с телом, все несколько проще, я об этом писала.
Ну а если тела нет, то можно сделать так.

class A
{
public:
A()
{func(this);};
virtual void pureVirtual()=0;
};

class B : public A
{
public:
virtual void pureVirtual(){};
};

void func(A* pA)
{
pA->pureVirtual();
}
дальше осталось где-нибудь вызвать

new B;


Поведение компилятора в данном случае не определено (undefined). Но большинство компиляторов скажут в рантайме "pure virtual function call".
Вообще не рекомендуется передавать this из конструктора или деструктора в качестве параметра.

Только не спрашивайте "А зачем это нужно?" :-)

1 коммент.:

Анонимный комментирует...

"веревка достаточной длины, чтобы выстрелить себе в ногу" ?
;)