У меня есть класс 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;
}
Поскольку чисто виртуальные функции могут иметь определения, и, если они есть, вы можете вызывать их не виртуально, используя синтаксис VirtualBase::f()
,
Компилятор не может определить, намерены ли вы определить функцию или нет, поэтому ошибка может быть обнаружена только компоновщиком.
Вызывать чисто виртуальную функцию не является ошибкой. Ошибочно вызывать любую функцию, у которой нет определения. Чистая виртуальная функция может иметь определение.