我試圖在其繼承樹中的一個類的構造函數中發現對象的最派生類。我已經花了好幾個小時來解決這個問題,並且對於我該怎麼做,或者爲什麼沒有意義,我感到不知所措。它似乎很有道理,但它拒絕工作。我發現了很多關於RTTI的網頁,並且基本上與他們無關。在我的測試用例及其輸出結束後,我會繼續進行解釋。「this」指針RTTI啓用了嗎?
源:
#include <iostream>
#include <typeinfo>
#include <string>
class A
{
public:
A(std::string foo);
virtual void bar(A* a) = 0;
};
class B : public A
{
public:
B();
virtual void bar(A* a);
};
A::A(std::string foo)
{
std::cout << "type as passed to A constructor: " << foo << " (" << this << ")" << std::endl;
std::cout << "type as determined in A constructor: " << typeid(*this).name() << " (" << this << ")" << std::endl;
}
B::B() : A(typeid(*this).name())
{
A* a = (A*)this;
std::cout << "type as determined in B constructor: " << typeid(*a).name() << " (" << this << ")" << std::endl;
this->bar(this);
}
void B::bar(A* a)
{
std::cout << "type as determined in bar: " << typeid(*a).name() << " (" << a << ")" << std::endl;
}
int main()
{
B b;
b.bar(&b);
return 0;
}
輸出(對於g ++):
type as passed to A constructor: 1B (0x7fff5fbff910)
type as determined in A constructor: 1A (0x7fff5fbff910)
type as determined in B constructor: 1B (0x7fff5fbff910)
type as determined in bar: 1B (0x7fff5fbff910)
type as determined in bar: 1B (0x7fff5fbff910)
我想要得到的輸出的第二行說 「1B」,而不是 「1A」 。 由於某些原因,我無法想象RTTI是否從「this」中刪除?這不會打破虛擬功能的想法嗎?(我已經用虛函數實現了這個功能,直到我發現我重新實現了RTTI的一部分,我之前並不知道)。輸出結果顯示,如果我避免使用「this」,我可以做到這一點,但需要要做到這一點看起來像設計破損。
你爲什麼要檢測類型?這是不好的。這聽起來像是一種嘗試(有缺陷)的解決方案,那是什麼? –
Alf,我將std :: std :: std :: std :: std :: std :: std :: std :: std :: std :: std :: std :: std :: std :: std :: std :: std :: std :: std :: std :: std :: std :: std :: std ::某個類的每個實例都有其自己的這種映射,以便允許將新對象輕鬆添加到這些核心對象中,並稍後通過類型進行檢索。 (在我知道RTTI之前,我使用const ints和虛擬方法的網絡進行此操作,出於同樣的原因出現同樣的故障。) – Grault