void fun() virtual vs void(*fun)()

173
23 марта 2018, 13:05

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

class Parent {
public:
  Parent(void (*fun)()) {
    get = fun;
  }
  void(*get)();
};

и

class Parent {
public:
int i;
Parent(int i) {
    this->i = i;
}
    void get() virtual;
};

class Child1 : Parent {
public:
    void get() {
        cout << "Error#1";
    }
};
Answer 1
  1. Виртуальные методы вызываются через таблицу виртуальных функций. Она общая для всех объектов одного и того же класса, а потому существует в единственном экземпляре в секции константных данных. А объекты просто ссылаются на эту таблицу через неявно хранимое поле vptr.

    Поэтому виртуальные методы используют там, где одна и та же функция применяется во всех экземплярах класса без изменений.

  2. Ну а члены-указатели хранятся непосредственно внутри объекта, из-за чего происходит дублирование. Как результат, у каждого объекта оказывается независимая копия.

    Поэтому указатели на функции используют, если каждый экземпляр одного и того же класса использует какой-то свой вариант функции, возможно, даже передаваемый извне.

READ ALSO
Использование dll в модуле node.js написанном C++

Использование dll в модуле node.js написанном C++

Есть модуль nodejs написанный на С++ (с использованием N-api)

186
Не запускается .exe файл [дубликат]

Не запускается .exe файл [дубликат]

На данный вопрос уже ответили:

189
CMake генерация .sln(Visual Studo)

CMake генерация .sln(Visual Studo)

Есть CMake скрипт для С++ проекта, c таким содержимым:

181
Dev C++ странно оперирует в cout с декрементом

Dev C++ странно оперирует в cout с декрементом

int t = 10; cout << t << endl << t * 2 << endl << --t;

179