期間改變的我剛discoverd以下行爲:具有A
類型派生B
類型的對象,的A
施工時的最終類型是A
和不B
。這可以用下面的例子可以觀察到:類型的對象構造
#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;
}
這個代碼(用gcc 4.8.5編譯)的運行如下:
0x400ae0
0x400ae0
0x400ac0
我們可以看到,通過在typeid的返回的類型A::A()
是A
而不是B
,然後最終類型更改爲B
。
爲什麼?
是否有可能在構建父類時知道「真正」最終類型?
我的背景是這樣的:
我有一個父類Resource
和幾類從它繼承。我也有一個ResourceManager
每個創建資源通知,並且必須知道創建資源的最終類型。我在做什麼,以避免重複的代碼是下面的,但它不工作:
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
};
我知道我可以做的通知,每個構造的孩子/析構函數,但它是不太可靠的(可能的錯誤如果一個資源沒有通知管理者即時通知)。 你有任何想法的解決方法?
嗯......'&typeid(....)'? – WhiZTiM
'A''''''''''''''你爲什麼期望'typeid'有所不同? –
@WhiZTiM爲什麼? typeid的返回值在每種類型的內存中都是唯一的。 – Caduchon