Właśnie discoverd następujące zachowanie: posiadanie obiektu typu B
pochodzącej od rodzaju A
ostateczny typ trakcie budowy jest A
A
i nie B
. Można to zaobserwować w poniższym przykładzie:Rodzaj obiektu zmieniającego się w czasie budowy
#include <iostream>
#include <typeinfo>
class A
{
public:
A() { std::cout << &typeid(*this) << std::endl; }
};
class B : public A
{
public:
B() : A() { std::cout << &typeid(*this) << std::endl; }
};
int main()
{
A a;
B b;
return 0;
}
przebiegu tego kodu (skompilowane z gcc 4.8.5) jest następujący:
0x400ae0
0x400ae0
0x400ac0
Widzimy, że typ zwracany przez typeid w A::A()
to A
, a nie B
, a następnie ostateczny typ zmienia się na B
.
Dlaczego?
Czy możliwe jest poznanie "prawdziwego" typu końcowego podczas budowy klasy macierzystej?
Moja kontekst jest następujący:
Mam klasa dominująca Resource
i kilka klas dziedziczeniu od niego. Mam również ResourceManager
powiadomiony o każdym utworzeniu zasobu i konieczności zapoznania się z ostatecznym typem utworzonego zasobu. Co robię, aby uniknąć duplikatów kod jest następujący, ale to nie działa:
class Resource
{
public:
Resource() { ResourceManager::notifyCreation(*this); }
~Resource() { ResourceManager::notifyDestruction(*this); }
};
class MyResource : public Resource
{
// I don't have to care to the manager here
};
wiem, że mogę zrobić zawiadomienie w każdym konstruktora/destruktora dzieci, ale jest to mniej wytrzymałe (możliwy błąd jeśli zasób zostanie wprowadzony bez powiadomienia do menedżera). Masz pomysł na obejście tego problemu?
Umm ... 'i typeid (....)' ?? – WhiZTiM
'' this' w 'A' jest zawsze' A', dlaczego oczekiwałeś, że 'typeid' będzie inny? –
@WhiZTiM dlaczego? Zwracana wartość typeid jest unikalna w pamięci dla każdego typu. – Caduchon