【发布时间】:2016-10-01 00:29:41
【问题描述】:
在这种特殊情况下,为什么我必须在基类中定义非纯虚方法以避免链接器错误?
这会导致链接器错误:
class A
{
public:
virtual ~A(){}
virtual void foo() = 0;
virtual void bar();
};
class B : public A
{
public:
void foo()
{
}
void bar()
{
}
};
int main()
{
B b;
}
输出:
/tmp/cc5E8Tit.o: In function `A::~A()':
:(.text._ZN1AD2Ev[_ZN1AD5Ev]+0x13): undefined reference to `vtable for
A' /tmp/cc5E8Tit.o:(.rodata._ZTI1B[_ZTI1B]+0x10): undefined reference
to `typeinfo for A' collect2: error: ld returned 1 exit status
但如果我在 A 类中定义 bar 方法,它就可以链接:
class A
{
public:
virtual ~A(){}
virtual void foo() = 0;
virtual void bar(){}
};
class B : public A
{
public:
void foo()
{
}
void bar()
{
}
};
int main()
{
B b;
}
...没有链接器错误。
这是为什么?
【问题讨论】:
标签: c++ linker-errors pure-virtual virtual-functions