Как работают виртуальные функции в заголовке, теле и производном классе? - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь понять, как использовать виртуальные функции.

Правильно ли следующее?Также я не включил бы виртуальный в .cpp файл базы?

А при определении производного класса я бы также объявил виртуальную функцию общедоступной для производного класса?

//BASE HEADER FILE

#ifndef BASE_H
#define BASE_H

class Base { 
public: 
    virtual double testFunc() = 0;
    int func2(); 
};

#endif

//BASE.CPP FILE 
#include "base.h" 

int Base::func2()
{
    return 5; 
}

//DERIVED HEADER FILE

#ifndef DER_H
#define DER_H

#include "base.h"

class Derived : public Base { 
public: 
    double testFunc();
};
#endif

//DER.CPP FILE 
#include "Der.h" 

double Derived::testFunc()
{
    return 3.2;
}

1 Ответ

2 голосов
/ 10 мая 2019

Вам не нужно добавлять virtual к функции, уже объявленной виртуальной в родительском классе.Спецификатор virtual указывает, что нестатическая функция-член является виртуальной и поддерживает динамическую диспетчеризацию.Он может появиться только в decl-specifier-seq первоначального объявления нестатической функции-члена (т. Е. Когда оно объявлено в определении класса).

Что такое виртуальная функция

Виртуальная функция - это функция-член, которая объявлена ​​в базовом классе и переопределена (переопределена) производным классом.Когда вы ссылаетесь на объект производного класса, используя указатель или ссылку на базовый класс, вы можете вызвать виртуальную функцию для этого объекта и выполнить версию функции производного класса.

Работа виртуальногофункции (концепция VTABLE и VPTR)

Если класс содержит виртуальную функцию, то компилятор сам делает две вещи:

  1. Если объект этого класса создан, то виртуальныйуказатель (VPTR) вставляется как член данных класса для указания на VTABLE этого класса.Для каждого нового созданного объекта новый виртуальный указатель вставляется в качестве члена данных этого класса.
  2. Независимо от того, создан объект или нет, статический массив указателя на функцию VTABLE, где каждая ячейка содержит адрес каждоговиртуальная функция, содержащаяся в этом классе.

Подробная информация о виртуальных функциях уже содержит множество хороших ответов Как реализованы виртуальные функции и vtable?

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