说我有这样的物理结构:这些名称冲突如何在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