Интерфейсы времени компиляции (невиртуальные)C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Интерфейсы времени компиляции (невиртуальные)

Сообщение Anonymous »

Если вы хотите иметь разные публичные интерфейсы для одного и того же объекта, вы можете использовать виртуальные базовые классы. Но у них есть накладные расходы (память и пространство).

Код: Выделить всё

class View1 {
public:
int x;
}
class View2 : virtual public View1 {
public:
int y;
}
class View3 {
public:
int* a;
}
class Complex : virtual public View1, virtual public View2, virtual public View3 {
}
Можно преобразовать объект в класс с разными модификаторами доступа и одинаковым размером. Это часто делается на простом языке C со структурами, позволяющими скрыть детали реализации. Но это решение по своей сути небезопасно и неопределенное поведение с, возможно, очень трудно обнаруживаемыми ошибками, поскольку оптимизатор, если он выполняет свою работу, может плохо обрабатывать запрещенные псевдонимы (одна и та же ячейка памяти имеет разные имена). А некоторые компиляторы могут изменить расположение памяти, если модификаторы доступа различны. Приведения типа Dynamic_cast, reinterpret_cast и bit_cast разрешены только для определенных классов.

Код: Выделить всё

class View1 {
public:
int x;
private:
int y;
int* a;
}

class Complex {
public:
int x;
int y;
int* a;
}
Теперь я нашел по крайней мере одно решение, которое использует суперклассы вместо базовых классов в качестве интерфейса и кажется законным. Это правда? Есть ли более простой способ добраться туда?
Complex.h:

Код: Выделить всё

#pragma once
#include 

class Complex {
protected:
Complex(int v) : x(0), y(0), a(new int) { *a = v };
~Complex() { std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/70237094/compile-time-interfaces-non-virtual[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»