考慮兩個指針如何檢查兩個指針是否指向同一個對象?
A* a;
B* b;
A和B是多態的類。 如何檢查a和b是否指向同一個對象?
更準確地說,我們指定a和b指向同一個對象,如果存在類型d的一些對象d,使得兩個*和* b是d的類層次結構的某個地方。
我建議如下解決方案:
dynamic_cast<void*>(a) == dynamic_cast<void*>(b)
實際上,根據該標準,
dynamic_cast<void*>(v)
產量「的指針最派生對象用V指向(n3242.pdf。 :§5.2.7 - 7)。 如果兩者的派生最相同的對象,那麼指針指向同一個對象。
我很確定它應該始終從實際的角度正確工作。但理論上,乍看之下,所提出的平等似乎會產生誤判,例如,如果b指向A的第一個成員(而不是A的祖先)。雖然A和它的成員實際上不可能獲得相同的地址,因爲A的虛擬表指針應該位於該成員之前,但該標準並沒有強制虛擬表並且沒有提及類佈局。
所以,我的問題是:
是所提出的解決方案,從標準的角度看是否正確?
有沒有關於私人(受保護)繼承或cv資格的警告?
有沒有更好的解決方案?
[編輯]
我試圖提出一些例子示出了相對複雜的場景。在這種情況下,動態交叉轉換和靜態轉換是不明確的。
// proposed impplementation:
template<typename P, typename Q>
bool test_ptrs(const P* p, const Q* q)
{
return (dynamic_cast<const void*>(p) == dynamic_cast<const void*>(q));
}
struct Root
{
virtual ~Root(){};
};
struct A: public Root // nonvirtually
{
};
struct B: public Root // nonvirtually
{
};
struct C: public A, B // nonvirtual diamond started with Root
{
Root another_root_instance;
};
int main()
{
C c;
A* pa= &c;
B* pb= &c;
bool b = (dynamic_cast<void*>(pa) == dynamic_cast<void*>(pb));
Root* pra= dynamic_cast<Root*> (pa);
Root* prb= dynamic_cast<Root*> (pb);
//Root* prc= dynamic_cast<Root*> (&c); // runtime error, ambiguous cast
Root* prr= dynamic_cast<Root*>(pra);
Root* pcar= dynamic_cast<Root*>(pra);
Root* pcbr= dynamic_cast<Root*>(prb);
if(
test_ptrs(pa, pb)
&& test_ptrs(pra, prb)
&& !test_ptrs(pa,&c.another_root_instance)
)
{
printf("\n test passed \n");
}
}
爲什麼不'a == b'? – iammilind 2012-04-02 10:24:00
@iammilind:A和B可能是一些D的基類,但彼此無關 – user396672 2012-04-02 10:27:02
@iammilind的+1 - 舊的'uns是最好的! – 2012-04-02 10:27:15