Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > C++ множественное наследование


Автор: Storm_tpv 14.12.2007, 23:59
Здаствуйте!
Я вот начал изучать тему множественного наследования.
и передо мной встала задача: написать след программу.
    Создать иерархии наследования: удочка, телескоп – телескопическая удочка.

Я почитал теории, пробовал и так и сяк, но ошибка появляется.
Я не знаю как бы мне изменить другие классы от udocika_teleskop
хочу передать в остальные классы данные созданные этим классом.
Вот что я написал.
Помогите понять или исправить ошибку.

Код

#include <iostream.h>
class udocika
{
protected:
    int length;
    double leska;
public:
    udocika():length(0), leska(0.0) {}
    udocika(int lh, double ls):
    length(lh), leska(ls) {}
    udocika(const udocika &ud):
    length(ud.length), leska(ud.leska) {}
    void getl(udocika &u, int length) 
    { 
        cout << "length:" << length << endl;
        cout << "leska:" << u.leska << endl;
    }
};

class teleskop
{
protected:
    int dlina;
    double dlina_leska;
public:
    teleskop():dlina(0), dlina_leska(0.0) {}
    teleskop(int dl, double ds):
    dlina(dl), dlina_leska(ds) {}
    teleskop(const teleskop &tl):
    dlina(tl.dlina), dlina_leska(tl.dlina_leska) {}
    void gett()
    { 
        cout << "length:" << dlina << endl;
        cout << "leska:" << dlina_leska << endl;
    }
};

class udocika_teleskop: public udocika, public teleskop
{
public:
    udocika_teleskop():udocika(), teleskop() {}
    udocika_teleskop(int ut, double dt):
    udocika(ut, 0.0), teleskop(0, dt) {}
    udocika_teleskop(const udocika_teleskop &udt):
    udocika(udt), teleskop(udt) {}
    void get() 
    {
        cout << "length2:" << length << endl;
        cout << "dlina2:" << dlina_leska << endl;
    }
};

void main()
{
    udocika_teleskop p;
    udocika m;
    p.get();
    udocika_teleskop s(50, 33.4);
    s.getl(m, p);
    s.gett();
}

Автор: JackYF 15.12.2007, 00:13
Цитата(Storm_tpv @  14.12.2007,  23:59 Найти цитируемый пост)
Я почитал теории, пробовал и так и сяк, но ошибка появляется.

Укажи её, мы не телепаты. И номер строки, на которую ругается компилятор.

Автор: Storm_tpv 15.12.2007, 00:17
Не могли бы вы в майне создать переменную класса udocika_teleskop чтобы она могла бы вызывать оба класса.
вот как здесь пример. Я не понимаю как мне это повторить:

class Student{
public:
  int mark;
...
};
class Worker{
public:
  int salary;
};
class Practicant: public Student, public Worker{
};
void PutMark(Student& s, int mark){
 s.mark = mark;
}
void PutSalary(Worker& w, int salary){
 w. salary = salary;
}

void main(){
Practicant p;
    PutMark(p,5);
    PutSalary(p,200);
}


Мне бы только в майне, остальное я описал уже.
Спасибо

Автор: Storm_tpv 15.12.2007, 00:36
Правильно я сделал?
У меня соменения, я не уверен, помогите пожалуйста.

Код

#include <iostream.h>
class udocika
{
protected:
    int length;
    double leska;
public:
    udocika():length(0), leska(0.0) {}
    udocika(int lh, double ls):
    length(lh), leska(ls) {}
    udocika(const udocika &ud):
    length(ud.length), leska(ud.leska) {}
    void getl() const
    { 
        cout << "length0:" << length << endl;
        cout << "leska0:" << leska << endl;
    }
};

class teleskop
{
protected:
    int dlina;
    double dlina_leska;
public:
    teleskop():dlina(0), dlina_leska(0.0) {}
    teleskop(int dl, double ds):
    dlina(dl), dlina_leska(ds) {}
    teleskop(const teleskop &tl):
    dlina(tl.dlina), dlina_leska(tl.dlina_leska) {}
    void gett() const
    { 
        cout << "length1:" << dlina << endl;
        cout << "leska1:" << dlina_leska << endl;
    }
};

class udocika_teleskop: public udocika, public teleskop
{
public:
    udocika_teleskop():udocika(), teleskop() {}
    udocika_teleskop(int ut, double dt):
    udocika(ut, 0.0), teleskop(0, dt) {}
    udocika_teleskop(const udocika_teleskop &udt):
    udocika(udt), teleskop(udt) {}
    void get() const
    {
        cout << "length2:" << length << endl;
        cout << "dlina2:" << dlina_leska << endl;
    }
};

void main()
{
    udocika_teleskop p;
    p.get();
    udocika_teleskop s(2,3);
    s.getl();
    udocika_teleskop k(5,1);
    k.gett();
}

Автор: crazy_hand 15.12.2007, 00:40
ты в main вызываешь функцию getl класса udocika. Прототип: 
Код
void getl(udocika &u, int length) ;

а ты ей вторым параметром передаешь не int а объект класса udocika_teleskop. В этом и ошибка. А вообще приучайся писать с директивами препроцессора #ifndef,#define,#endif, а так же разделять интерфейс и реализацию, определяй сам класс в .h файлы - его методы в .cpp файле. И названия классов гораздо лучше смотрятся, если они написаны по-английски =)


Автор: Storm_tpv 15.12.2007, 00:53
Все я понял:
По условию задания я правильно вызвал и определил?

для класса udocika
Код

void getl(udocika &u, int length)
    { 
        cout << "length0:" << length << endl;
        cout << "leska0:" << u.leska << endl;
    }


а вот main
Код

udocika_teleskop s;
    s.getl(s,5);

Автор: crazy_hand 15.12.2007, 01:43
ну лично мне больше нравится второй вариант твой. Но в конечном счете все определяется твоими задачами и поставленными целями. Но вообще, я бы посоветовал(как меня учили и как я стараюсь писать) писать так: в базовом классе определяется 2-а метода, один открытый, а другой защищенный(виртуальный). Открытый внутри себя вызывает защищенный. Защищео нный, если нужно, в классах-потомках переопределяется.

Автор: chipset 17.12.2007, 12:03
А где у тебя там аналогия с Student, Worker, Practicant? Суть в эталонной задаче в правильном выборе из перегруженных функций. А в твоем коде я вообще не вижу перегруженных функций которые заточены под удочку и телескоп.
Короче задача непонятна smile

Автор: regis 17.12.2007, 13:45
От себя добавлю, что пример выбран какой-то неудачный. ;(

(Когда применяем множественное наследование, предполагается наследование классом свойств от двух (или более) суперклассов. А удочка-телескоп, очевидно, много наследует от удочки, но как-то очень мало -- от телескопа.)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)