5

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;
}
4

2 に答える 2

12

純粋仮想関数は定義を持つことができ、定義がある場合は、構文を使用して非仮想関数で呼び出すことができますVirtualBase::f()

コンパイラには、関数を定義するかどうかを判断する方法がないため、エラーはリンカによってのみ検出できます。

于 2012-09-27T17:17:10.177 に答える
8

純粋仮想関数を呼び出すことはエラーではありません。定義のない関数を呼び出すのはエラーです。純粋仮想関数は定義を持つことができます。

于 2012-09-27T17:15:31.143 に答える