当派生类调用基类的纯虚函数时,为什么g ++不抱怨?

时间:2012-09-27 17:12:58

标签: c++ linker g++ ld pure-virtual

我有一个具有纯虚函数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;
}

2 个答案:

答案 0 :(得分:12)

因为纯虚函数可以有定义,如果有,你可以使用语法VirtualBase::f()非虚拟地调用它们。

编译器无法判断您是否打算定义函数,因此错误只能由链接器检测到。

答案 1 :(得分:8)

调用纯虚函数不是错误。调用任何没有定义的函数是错误的。纯虚函数可以有一个定义。