Wywołanie przesłoniętej funkcji z konstruktora klasy bazowej

0

Cześć, weźmy taki kod:

class A
{
public:
	A()
	{
		DoJob();
	}

protected:
	virtual void DoJob() = 0;
};

class B : public A
{
public:
	B(){};
protected:
	virtual void DoJob() override
	{
		MessageBox(NULL, L"OK", L"", MB_OK);
	}
};
 

Ten kod nie zadziała dlatego, że klasa B w momencie wykonywania konstruktora klasy A nie jest jeszcze w pełni utworzona. Więc w klasie A wywołanie DoJob() wywoła tak naprawdę metodę A::DoJob(), co zakończy się katastrofą.

OK, jest to logiczne. Ale teraz pytanie jest następujące:
Jak spowodować (czy są jakieś patterny, czy dobre rozwiązania), żeby z konstruktora klasy bazowej można było wywołać metodę przesłoniętą z klasy potomnej?

1

Nie można tak zrobić, bo na poziomie konstruktora klasy bazowej obiekt na rzecz, którego wołany jest konstruktor nie jest jeszcze typu klasy pochodnej.

0

I nie ma żadnego obejścia takiej sytuacji?

0

Jest, wołanie metod wirtualnych zaraz po tym jak obiekt zostanie stworzony.

0

Zgadzam się z @Satirev. Chcesz za dużo wykonać podczas konstrukcji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1