說我有這樣的物理結構:這些名稱衝突如何在C++中解決?
/
+-- conflicttest
| +-- A.cpp
| +-- A.h
| +-- main.cpp
+-- libconflict
| +-- conflict
| | +-- A.h
| | +-- B.h
| +-- A.cpp
| +-- B.cpp
這些libconflict的來源,深呼吸:
// libconflict B.h
class B
{
public:
void bar();
protected:
int j_;
};
class B
在libconflict實現:在libconflict
class B
頭
// libconflict B.cpp
#include "conflict/B.h"
void B::bar()
{
std::cout << "B::bar" << std::endl;
}
class A
頭球libconflict:
// libconflict A.h
# include "conflict/B.h"
class A : public B
{
public:
A();
private:
int i_;
};
class A
在libconflict實現:
#include "conflict/A.h"
A::A()
{
std::cout << "libconflict A is alive" << std::endl;
i_ = 51; // some random fields and values... I should admit I am lost
j_ = 47;
}
現在conflicttest的來源,它幾乎在:在conflicttest
class A
頭:
// conflicttest A.h
class A
{
public:
A();
void foo();
};
class A
實施conflicttest:
// conflicttest A.cpp
#include "A.h"
A::A()
{
std::cout << "A is alive" << std::endl;
}
void A::foo()
{
std::cout << "A::foo" << std::endl;
}
最後,main.cpp
:
// main.cpp in conflicttest
#include "conflict/A.h"
int main()
{
B* b = new A;
b->bar();
return 0;
}
呼...我使用Visual Studio 2010來構建這個解決方案。 conflicttest
是與靜態庫libconflict
鏈接的可執行文件。 這將編譯有魅力,但是,不管你信不信,輸出爲:
A is alive
B::bar
鏈接器實際使用從conflicttest
符號A
這絕對不是一個B
更糟的是,它可以調用B::bar()
。
我迷路了,編譯器怎麼沒有抱怨?
你讓我失去了一半。但顯而易見的答案是 - 不要像這樣構建你的項目。 – 2011-06-14 16:20:03