Здравствуйте! Вот я столкнулся с задачей на с++, я сам не могу пока ее решить, прошу Вас, разъясните эту задачу и дайте полное её решение вместе с программой.
Заранее Вас благодарю.
Вот, сама задача:
Вам дана следующая иерархия классов:
struct Base { ... };
struct D1 : Base { ... };
struct D2 : Base { ... };
struct D3 : D1, D2 { ... };
Напишите функцию D1BaseToD2Base, которая преобразует указатель типа Base на объект типа D3, который ссылается на экземпляр Base, соответствующий D1, в указатель, ссылающийся на экземпляр Base соответствующий D2.
Указание: не забывайте про константность!
Напишите программу:
// base указывает на экземпляр Base, соответствующий D1
// нужно вернуть указатель на экземпляр Base, соответствующий D2
Base const * D1BaseToD2Base( Base const * base )
{
return ...
}
и заводим переменную Base.ownership по которой будем определять у нас экземляр Base или указатель. Внутри Base скрытую ссылку на base.
Если ownership==soReference, то все гетеры и сеторы обращаются через ссылку this.base.
Если ownership==soOwned, то все гетеры и сеторы обращаются к полям класса.
Base const * D1BaseToD2Base( Base const * base )
{
D3 *d3=(D3 *)(base.parent); // Будем изменять на месте, а не создавая новый объект.
D2 *d2=new D2(this, d3.d1.base, soReference); // инстанцируем в указатель, ссылающийся на экземпляр Base
if (d3.d1.base.ownership==soOwned){
//d3.d1.base.parent=d2; // Говорим что объект теперь в коллекции d2.
// Так поступить мы не можем так как объект у нас константный
// Можно сделать так
d3.d1.base.setParent(d2);
} else {
delete d3.d1.Base;
}
d3.d1=nil;
return d3.base;
}
Конструктор
Base* Base(void* parent; Base* aBase; Owenship aOwenship)
{
this.parent=aParent;
if (aOwenship==soReference) {
this.base=aBase;
} else {
this.value=aBase.value; // инстанцируем(отпочковываем) при помощи копирования значения полей.
}
}
по умолчанию не создает ромбовидного наследования: компилятор обрабатывает каждый путь наследования отдельно, в результате чего объект D будет на самом деле содержать два разных подобъекта A