Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Множественное наследование, помогите разобраться!! 
:(
    Опции темы
Natata
Дата 22.3.2009, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 22.3.2009

Репутация: нет
Всего: нет



надо написать программу которая представляет собой множественное наследие классов
Class1 - Person(базовый класс): фамилия, пост, №кабинета
Class2 - Birthday(производный класс от Class1): день, месяц и год рождения
Class3 - Salary(производный класс от Class1): зарплата, налбавка
Class4 - AllInf(производный класс от Class2 и Class3): №телефона

проблема с наследованием классом Class4 класса Class1, т.к. происходит дублирование информации. пробовала сделать Class1 виртуальным для производных классов, но все равно ничего не выходит(((

Код

//------------------------------Class1.h----------------------------
class Person{
public:
    char LastName[20];
    char Post[16];
    int Cabinet;
public:
    Person(void);
    Person(char *LastName, char *Post, int Cabinet);
    Person(Person &rPerson);

    void AddPerson(void);
    void ShowPerson(void);
};
//-----------------------------Class1.cpp--------------------------
#include <iostream>
#include "Class1.h"
using namespace std;

Person::Person(void)
{
}
Person::Person(char *nLastName, char *nPost, int nCabinet)  
{
    for (int i = 0; i < 20; i++) LastName[i] = nLastName[i];
    for (int i = 0; i < 16; i++) Post[i] = nPost[i];
    Cabinet = nCabinet;
}
Person::Person(Person &rPerson)
{
    *this = rPerson;
}
void Person::AddPerson(void)
{
    char nLastName[20];
    char nPost[16];
    int nCabinet;

    cout << "\n LastName & Initials: ";
    cin >> nLastName;
    cout << "\n Post: ";
    cin >> nPost;
    cout << "\n Cabinet: ";
    cin >> nCabinet;

    for (int i = 0; i < 20; i++) LastName[i]=nLastName[i];
    for (int i = 0; i < 16; i++) Post[i] = nPost[i];
    Cabinet = nCabinet;
}
void Person::ShowPerson(void)
{
    printf("|------------------------------------------|\n");
    printf("|Last Name & Initials|      Post      |NCab|\n");
    printf("|------------------------------------------|\n");
    printf("|%20s|%16s|%4i|\n", LastName, Post, Cabinet);
    printf("|------------------------------------------|\n");  
}
//---------------------------------Class2.h---------------------------
#include "Class1.h"
class Birthday : public virtual Person
{
public:
    int Day;
    int Month;
    int Year;
public:
    Birthday(void);
    Birthday(int Day, int Month, int Year);
    Birthday(Birthday &rPerson);
    virtual ~Birthday(void);

    void AddPerson(void);
    void ShowBirthday(void);
};
//-------------------------------Class2.cpp---------------------------
#include <iostream>
#include "Class2.h"
using namespace std;

Birthday::Birthday(void)
{
}
Birthday::Birthday(int nDay, int nMonth, int nYear)/*:Person(char *nLastName)*/
{
    Day = nDay;
    Month = nMonth;
    Year = nYear;    
}
Birthday::Birthday(Birthday &rPerson):Person( rPerson )
{
    *this = rPerson;
}
Birthday::~Birthday(void)
{
}
void Birthday::AddPerson(void)
{
    Person::AddPerson();

    int nDay;
    int nMonth;
    int nYear;

    cout << "\n Day: ";
    cin >> nDay;
    cout << "\n Month: ";
    cin >> nMonth;
    cout << "\n Year: ";
    cin >> nYear;

    Day = nDay;
    Month = nMonth;
    Year = nYear;
}
void Birthday::ShowBirthday(void)
{
    printf("|-----------------------------------------------------|\n");
    printf("|Last Name & Initials|      Post      |NCab| Birthday |\n");
    printf("|-----------------------------------------------------|\n");
    printf("|%20s|%16s|%4i|%2d.%2d.%4d|\n", LastName, Post, Cabinet, Day, Month, Year);
    printf("|-----------------------------------------------------|\n");  
}
//----------------------------------Class3.h---------------------------
#include "Class1.h"
class Salary : public virtual Person
{
public:
    int Pay;
    int Raise;
public:
    Salary();
    Salary(int Pay, int Raise);
    Salary(Salary &rPerson);
    virtual ~Salary(void);

    void AddPerson(void);
    void ShowSalary(void);
};
//---------------------------------Class3.cpp-------------------------
#include <iostream>
#include "Class3.h"
using namespace std;

Salary::Salary()
{
}
Salary::Salary(int nPay, int nRaise)/*:Person(char *nLastName)*/
{
    Pay = nPay;
    Raise = nRaise;
    
}
Salary::Salary(Salary &rPerson):Person( rPerson )
{
    *this = rPerson;
}
Salary::~Salary()
{
}
void Salary::AddPerson(void)
{
    Person::AddPerson();

    int nPay;
    int nRaise;

    cout << "\n Pay: ";
    cin >> nPay;
    cout << "\n Raise: ";
    cin >> nRaise;

    Pay = nPay;
    Raise = nRaise;
}
void Salary::ShowSalary(void)
{
    printf("|------------------------------------------------------|\n");
    printf("|Last Name & Initials|      Post      |NCab| Pay |Raise|\n");
    printf("|------------------------------------------------------|\n");
    printf("|%20s|%16s|%4i|%5i|%5i|\n", LastName, Post, Cabinet, Pay, Raise);
    printf("|------------------------------------------------------|\n"); 
}
//---------------------------Class4.h------------------------------
//#include "Class2.h"
#include "Class3.h"
class AllInf : public Birthday, public Salary 
{
public:
    char Phone[11];
public:
    AllInf(void);
    AllInf(char *Phone);
    AllInf(AllInf &rPerson);
    virtual ~AllInf(void);

    void AddPerson(void);
    void ShowAllInf(void);
};
//-----------------------Class4.cpp-----------------------------------
#include <iostream>
#include "Class4.h"
using namespace std;

AllInf::AllInf(void)/*: Birthday(), Salary()*/
{
}
AllInf::AllInf(char *nPhone)/*:Person(char *nLastName)*/
{
    for (int i = 0; i < 11; i++) Phone[i] = nPhone[i];
}
AllInf::AllInf(AllInf &rPerson): Birthday( rPerson ), Salary( rPerson )
{
    *this = rPerson;
}
AllInf::~AllInf()
{
}
void AllInf::AddPerson(void)
{
    Birthday::AddPerson();
    Salary::AddPerson();

    char nPhone[11];

    cout << "\n Phone: ";
    cin >> nPhone;

    for (int i = 0; i < 11; i++) Phone[i] = nPhone[i];
}
void AllInf::ShowAllInf(void)
{
    printf("|-----------------------------------------------------------------------------|\n");
    printf("|Last Name & Initials|      Post      |NCab| Birthday | Pay |Raise|   Phone   |\n");
    printf("|-----------------------------------------------------------------------------|\n");
    printf("|%20s|%16s|%4i|%2d.%2d.%4d|%5i|%5i|%11s|\n", LastName, Post, Cabinet, Day, Month, Year, Pay, Raise, Phone);
    printf("|-----------------------------------------------------------------------------|\n");   
}
//-------------------------------Main------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <tchar.h>
#include <iostream>
#include <fstream>
#include "Class4.h"
using namespace std;

void main()
{
    AllInf Men;
    Men.AddPerson();
    Men.ShowAllInf();
    //AllInf Men1("Grishchenko O.A.","02","11","1990");
    //Men1.ShowSalary();
    AllInf Men2(Men);
    Men2.ShowPerson();
    getch();
}



PM MAIL   Вверх
mes
Дата 22.3.2009, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



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

Ну а по теме с какой такой стати, Birthday является наследником Person ?! тоже относится и ко всем остальным наследованиям.
Выбор стратегии, имхо, неправильный .. гораздо лучше включение.



--------------------
PM MAIL WWW   Вверх
Natata
Дата 22.3.2009, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 22.3.2009

Репутация: нет
Всего: нет



Извеняюсь за неправильное оформление темы...первый раз пишу на таких форумах
Если коротко, то мне нужно создать такое наследие классов

         Class1
          /      \
Class2       Class3
         \        /
        Class4

Проблема заключается в том, что класс Class4 наследует класс Class1 не на прямую, а через классы Class2 и Class3 и происходит дублирование класса Class1
PM MAIL   Вверх
cutwater
Дата 22.3.2009, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 2
Всего: 10



Читать виртуальное наследование.

Добавлено через 23 секунды
Ваша задача - классический пример "бриллиантового наследования"


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0473 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.