Корневой базовый класс в C++

Каждый объект в.NET наследовался (прямо или косвенно) общему корневому основному "Объекту". Там такой общий объект является корнем в C++? Как я передаю какой-либо объект функции?

public void DoSomeStuff(object o) { ... }

Править: Разъясниться, цель: В той функции я хочу вызвать указатель на функцию членства. Для этого мне нужны экземпляр объекта и указатель на необходимую функцию. Для упрощения удобочитаемости, я хочу сделать обертку, содержащую обе запрошенной информации. Я не уверен, является ли это лучшим способом, но это - фоновая идея.

10
задан Littlesmith 8 March 2010 в 07:29
поделиться

6 ответов

Не существует общего корневого класса. Используйте либо void *, чтобы передать любой объект в функцию, либо лучше определить какой-нибудь базовый класс.

6
ответ дан 3 December 2019 в 16:52
поделиться

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

template <class T>
void DoSomeStuff(T const &t) {
    // Do the stuff with t...
    t.callTheFunction();
}

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

Кроме того, вы получили дополнительное преимущество, заключающееся в возможности специализировать функцию шаблона DoSomeStuff () для некоторых классов, которые вам не принадлежат, и которые не могут наследовать вашу виртуальную функцию-член.

4
ответ дан 3 December 2019 в 16:52
поделиться

К сожалению, в C ++ нет корневого базового объекта. Но вы можете определить свой собственный для всех ваших классов.

0
ответ дан 3 December 2019 в 16:52
поделиться

Для этого мне нужен экземпляр объекта и указатель на требуемую функцию .

Это очень похоже на «делегатов». Во-первых, вам определенно нужно будет определить общий базовый класс для всех объектов, которые вы хотите вызвать. В C ++ вы можете использовать множественное наследование, если объект уже принадлежит какой-либо другой иерархии.

Затем прочтите Функции-члены и самые быстрые из возможных делегатов C ++ , которая представляет собой отличную подробную статью по теме делегатов (которые представляют собой объект и указатель на функцию-член, связанные вместе). Используя заголовочный файл, описанный в этой статье, вы можете создавать делегатов и легко вызывать их, как обычные указатели на функции.

2
ответ дан 3 December 2019 в 16:52
поделиться

В C ++ нет общего базового класса. Однако уже есть библиотеки, позволяющие вызывать функции-члены в качестве делегатов. Вы можете попробовать использовать boost :: function вместе с boost :: bind или boost :: lambda .

0
ответ дан 3 December 2019 в 16:52
поделиться

Общего базового класса не существует, но использование чего-то вроде boost :: any или в более общем смысле, подход на основе шаблона предпочтительнее, чем void *.

12
ответ дан 3 December 2019 в 16:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: