Пусть у меня есть пара базовых классов:Многократные Ссылки Наследование Класс
class A
{};
class B
{
virtual void foo(A* ref);
virtual void foo2(A* ref);
};
и от них, несколько производных классов:
class C : virtual public A
{
int data;
};
class D : public B
{
virtual void foo(A* ref)
{
((C*) (ref)).data = 5;
}
};
class E : virtual public A
{
int otherData;
};
class F : public B
{
virtual void foo2(A* ref)
{
((E*) (ref)).otherData = 6;
}
};
И, наконец, у нас есть класс, который следует костюм, как таковые:
class G : public E, public C
{
};
с основной функцией, которая идет следующим образом:
int main()
{
B* myD = new D();
B* myF = new F();
A* myA = new G();
myD->foo(myA);
myF->foo2(myA);
return 0;
}
Хорошо, не обращая внимания на очевидный факт, что это «ужасный алмаз» (который, «составными как» проблема была предотвращена благодаря virtual
), общая идея заключается в том, что я хочу, чтобы все мои объекты будут Gs, Ds и Fs, но сохраняются как ссылки на As и Bs. Я хочу иметь возможность использовать виртуальные функции B (которые на самом деле всегда являются D или F) для изменения значений G ... Однако A и B не знают ни одного из своих дочерних классов и поэтому не могут быть объявлены с использованием их. Это означает, что аргументы виртуальной функции всегда должны быть указателем на A. Однако D хочет, чтобы его вход всегда был C, а F хочет, чтобы он был символом E. Хотя это может и не быть проблемой, если G был наследующий только от одного родителя, наш текущий G наследуется от 2 родителей; Я не знаю, как указатели this
действительно работают в контексте контекста таких ситуаций ... однако я не чувствую, что это будет возможная ситуация.
Может кто-нибудь захочет пролить свет на механизмы указателей каста на родительские/дочерние классы, и если будет какой-нибудь способ, это можно было бы снять?
На самом деле, я боюсь, что здесь нет алмаза, это: 1/использование непроверенных указателей =>, пожалуйста, передайте 'ref' по ссылке и 2/использование C-casts => используйте соответствующие C++ casts (здесь, вероятно, с проверкой времени выполнения). –