виртуальная функция в C ++ должна быть реализована? - PullRequest
0 голосов
/ 17 сентября 2018
class A
{
public:
    A(){}
    virtual void func();
};
class B:public A
{
    void func(){}
}

, если func не реализовано, будет ошибка связывания, когда я определю один объект A.Так почему же?Я не звонил func.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

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

0 голосов
/ 17 сентября 2018

, если функция не реализована, при определении одного объекта из A. возникнет ошибка связи. Так почему?

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

[class.virtual]

Виртуальная функция, объявленная в классе , должна быть определена или объявлена ​​чистой ([class.abstract]) в этом классе, или оба;Диагностика не требуется ([basic.def.odr]).

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

Если компоновщик смог диагностировать отсутствующее определение, то вы можете считать себя счастливчиком, поскольку диагностика не предусмотрена стандартом.Если сообщение было расплывчатым, то есть причина, по которой диагностика не обязательна.Линкеру непросто выяснить, почему источник не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...