Понимание указателя на члена класса типа - без полиморфизмаC++

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

Сообщение Anonymous »

Я подумал, что прямолинейно, что « указатель на члена класса t типа defivedt » может использоваться в качестве « указателя к члену класса t type baset », если Baset является основанием defivedt . Аналогия кажется очевидной, по крайней мере, для меня, как и defivivedt* может использоваться в качестве основы*, так что defiviedtt t ::* должна использоваться в качестве основы t ::*.
Но это не так:
struct BaseT
{
};

struct DerivedT: public BaseT
{
};

struct T
{
DerivedT m_test;
};

using BaseTMemPtr = BaseT T::*;

int main()
{
T test;
BaseT* simplePtr = &test.m_test; //It is DerivedT*, but can be used as BaseT*
BaseT (T::*memPtr) = &T::m_test; //Error, BaseT T::* cannot be used as DerivedT T::*
BaseTMemPtr memPtr2 = &T::m_test; //Error, just the same
}
< /code>
Как я вижу, есть два способа интерпретировать указатели на члены класса: < /p>
  • Код: Выделить всё

    *DerivedT T::**
    - это указатель dreviedt , который указывает на объект dreivedt внутри объекта t класса (поэтому указывает на объект относительно другого объекта).
  • Код: Выделить всё

    DerivedT T::*
    указывает на некоторую часть объекта класса t , который, кстати, имеет свой путь type.
Итак, основное различие между этими двумя способами - это то, что первое может быть интерпретировано как своего рода полученное (обеспечивающее полимфизм). Лот. < /p>
Почему C ++ выбрал второй подход? Что может быть нежелательным следствием включения использования dreviedtt t ::* в качестве базы t ::*? Каковы указатели на членов на практике?

Обновление:
Я хотел бы достичь следующего:
желаемое решение
Но это не работает, если участники не работают, но код>, но necdants
Постоянный (не указанный (не указатель-член) указатель на нестатический объект. (время компиляции) < /li>
Участники класса Mark как включены - например, В массиве - (время компиляции) < /li>
Construction (Runtime) < /li>
Участники вызовут функцию регистра (время выполнения) < /li>
В функции регистра необходимо проверить, разрешено ли абонент (мы получаем его в качестве регулярного указателя) называть эту функцию или нет (выполнение выполнения). Описание:
В библиотеке у меня есть базовый класс CRTP (

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

DataBinding
), от чего пользователи должны спуститься, если они хотели бы использовать свое время компиляции и функциональность времени выполнения. Конечный пользователь может использовать производные классы для добавления нестатических объектов члена класса в своих пользовательских классах DataBinding -descendend. И вот появляется новая функциональность, которая требует полиморфизма указателя к члену: пользователь должен иметь возможность отметить некоторых из членов класса на основе Basemember при скомпилированном времени (!) (Сам класс не имеет конструктора ContexPR ). На мой взгляд, этот «марка» может хранить указатель к членам объекта потомка Basemember потомков, и только отмеченные объекты должны быть разрешены для выполнения выполнения функции члена класса (

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

registerMember
) В DataBinding (база CRTP текущего класса).
В функции Registermember выполнение у меня есть указатель объекта (содержащий объект), у меня есть определенный список пользователя с компиляцией, который определяет, что идентифицирует, что я идентифицирует, и на самом деле идентификация, и на самом деле, и уникально-идентифицированные), и я могу быть заменен на идентификацию. Мне нужно проверить, разрешено ли фактический указатель члена для вызова функции (он был помечен во время компиляции).

Подробнее здесь: https://stackoverflow.com/questions/695 ... lymorphism
Ответить

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

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

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

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

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