我有一个具有纯虚函数Base
的类f()
。另一个班级Derived
来自Base
。我从f()
内拨打Derived
。使用g ++,我从链接器中收到错误。
[agnel@dooku tmp]$ g++ pure_virtual_function_call.cpp
/tmp/ccGQLHi4.o: In function `Derived::f()':
pure_virtual_function_call.cpp:(.text._ZN7Derived1fEv[_ZN7Derived1fEv]+0x14): undefined reference to `VirtualBase::f()'
collect2: error: ld returned 1 exit status
在我看来,错误是由链接器捕获的。为什么编译器没有报告此错误?为什么要将它留给链接器?
以下是代码:
#include <iostream>
using namespace std;
class VirtualBase {
public:
virtual void f() = 0;
};
class Derived : public VirtualBase {
public:
void f(){
VirtualBase::f();
cout << "Derived\n" ;
}
};
int main(){
Derived d;
d.f();
return 0;
}
答案 0 :(得分:12)
因为纯虚函数可以有定义,如果有,你可以使用语法VirtualBase::f()
非虚拟地调用它们。
编译器无法判断您是否打算定义函数,因此错误只能由链接器检测到。
答案 1 :(得分:8)
调用纯虚函数不是错误。调用任何没有定义的函数是错误的。纯虚函数可以有一个定义。