Совместное использование функциональности класса между двумя или более библиотеками с чисто виртуальными функциями - PullRequest
0 голосов
/ 27 февраля 2012

Все нормально,

имеет:

class A
{
    virtual x() = 0;
    virtual y() = 0;
}

class B
{
    virtual x() = 0;
    virtual z() = 0;
}

class C : A , B
{
    x();
    y();
    z();
}

чтобы поделиться экземплярами класса C с двумя библиотеками, одна из которых знает только A, а другая знает только B?

Как:

Библиотека 1:

#include <a>

A* a = function_in_the_core_that_creates_a_C_and_retrieves_it();
a->x();
a->y();

Библиотека 1:

#include <b>

B* b = function_in_the_core_that_creates_a_C_and_retrieves_it();
b->x();
b->z();

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

EDIT:

function_in_the_core_that_creates_a_C_and_retrieves_it () должен возвращать C *, а не C. Я подумал, что это было понятно, поскольку речь идет о виртуальных функциях.

Ответы [ 2 ]

1 голос
/ 27 февраля 2012

Как есть, нет.Вы вызываете одну и ту же функцию в обоих случаях;единственный способ, который может работать - это вернуть C*.Их можно преобразовать в A* или B* только в том случае, если известно определение C (и это также потребует, чтобы наследование было общедоступным).

Если у вас есть две отдельные функции, одна возвращаетA* и один возвращается B*, тогда это будет хорошо.Каждый подобъект базового класса содержит достаточно информации, чтобы виртуальная диспетчеризация и RTTI работали правильно, без знания динамического типа объекта.

1 голос
/ 27 февраля 2012

Вы действительно должны сделать код скомпилированным. C является частным наследником A и B, поэтому этот пример не будет запущен. class C : public A , public B является исправленной декларацией для C. Вам также не хватает типов возвращаемых данных для функций.

Либо function_in_the_core_that_creates_a_C_and_retrieves_it вернет B*, который затем будет соответствовать полному происхождению B и будет работать как B для всех намерений и целей - либо вернет C*, в котором case вы должны будете предоставить полное объявление C, чтобы назначение работало без явного приведения. У вас не может быть C только что объявлено, чтобы сделать это.

Итак, вы либо возвращаете указатель на B, и в этом случае проблем нет - либо указатель на C, где вам нужно будет указать полное происхождение, чтобы выполнить назначение без потенциально опасного приведения. .

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