Данный:
Example.h
struct Base {
virtual ~Def() = default;
virtual void accept(struct DerivedVisitor* v) = 0;
};
struct Derived : Base {
int num;
void accept(struct DerivedVisitor* v) override;
};
struct DerivedVisitor {
virtual void visit(Derived* d) = 0;
};
Example.cpp
#include "Example.h"
void Derived::accept(struct DerivedVisitor* v) {
v->visit(this);
}
Скажем, я хотел создать экземпляр Derived "с нуля". Поскольку он содержит виртуальную функцию из Base , как мне получить адрес его таблицы виртуальных функций, чтобы я мог сделать что-то вроде этого:
Main.cpp
#include <iostream>
#include <memory>
#include "Example.h"
struct Visitor : DerivedVisitor {
void visit(Derived* d) override {
std::cout << d->num << std::endl;
}
};
int main() {
int num = 5;
// Create Derived instance from scratch
auto der = malloc(sizeof(Derived));
auto derBytes = static_cast<char*>(der);
new (derBytes) void*(/*HERE I NEED POINTER TO Derived VFT*/); // <------------- How?
new (derBytes + sizeof(Base)) int(num);
// Just to see that it works:
Base* base = reinterpret_cast<Derived*>(der);
Visitor visitor{};
base->accept(&visitor);
free(der);
return 0;
}
Этот компилятор специфичен? Если это так, я использую MinGW, если кто-то знаком с ним.
1 ответ
Этот компилятор специфичен?
Да, это зависит от компилятора.
В языке C ++ не существует такой вещи, как «таблица виртуальных функций». Такая таблица является деталью реализации.
Учитывая, что такая таблица не существует в языке, также нет возможности получить указатель на таблицу в стандартном C ++. Предполагая, что в вашем компиляторе есть такая вещь, как виртуальная таблица (что является разумным предположением), возможно, ваш компилятор задокументировал способ доступа к ней. Однако я в этом сомневаюсь. Возможно, вам придется сделать это на языке ассемблера.
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.
Def
?