Почему g ++ не жалуется, когда производный класс вызывает чисто виртуальную функцию base?

У меня есть класс 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;
}

5

Решение

Поскольку чисто виртуальные функции могут иметь определения, и, если они есть, вы можете вызывать их не виртуально, используя синтаксис VirtualBase::f(),

Компилятор не может определить, намерены ли вы определить функцию или нет, поэтому ошибка может быть обнаружена только компоновщиком.

12

Другие решения

Вызывать чисто виртуальную функцию не является ошибкой. Ошибочно вызывать любую функцию, у которой нет определения. Чистая виртуальная функция может иметь определение.

8

По вопросам рекламы [email protected]