我已经写了以下代码:
//--a.cpp--//
#include <stdio.h>
class A
{
public:
void bar();
virtual void foo()=0;
};
class B: public A
{
public:
void foo()
{
A::bar();
}
}
int main()
{
B *b= new B();
b->foo();
return 0;
}
//--b.cpp--//
#include <stdio.h>
class A
{
public:
void bar()
{
printf("class A");
}
}
现在我将这些模块联系起来,如下所示:
g++ -c a.cpp
g++ -c b.cpp
g++ -o bin a.o b.o
但是undefined reference error
是由链接器引发的。我不明白,为什么?
答案 0 :(得分:3)
您尚未在A::bar()
中定义a.cpp
。在B::foo()
中调用该方法,但它没有实现。所以链接器无法链接它。
在b.cpp
中,您创建了另一个类名A
,但它与第一个类名无关。它不会在这里产生任何问题,但如果您将任何一个文件包含在另一个文件或第三个文件中的两个文件中,您将获得重新定义错误(尽管包含 .cpp 并不常见)。一个翻译单元中只能有一个名称定义。
通常的做法是在头文件(.hXX)中声明类并实现源文件(.cXX)中的方法。如果您希望方法为inline
d,则可以在标头中定义或将方法明确声明为 inline 。请参阅Translation Unit,ODR。