Форум программистов, компьютерный форум CyberForum.ru

Ошибка при наследовании - C++

Восстановить пароль Регистрация
 
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
30.10.2011, 15:03     Ошибка при наследовании #1
Имеется архитектура вида: класс "человек", от него производные "препод" и "член приемной комиссии". От их двоих производный класс "Препод и член приемной комиссии". При создании указателя на класс человек и попытки присвоения ему адреса на объект "препод и член приемной комиссии" сообщает что "человек" не является базовым классом для "препод и ЧПК".
error C2614: 'TeacherAndChPrKom' : illegal member initialization: 'Human' is not a base or member
В чем проблема? Ведь по идее базовый класс должен считаться базовым для производных любого уровня от него. Или я не прав?
Миниатюры
Ошибка при наследовании  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.10.2011, 15:03     Ошибка при наследовании
Посмотрите здесь:

C++ Ошибка при наследовании
C++ Ошибка при наследовании
Ошибка в наследовании C++
C++ Ошибка при наследовании?
C++ Ошибка при наследовании класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.10.2011, 15:09     Ошибка при наследовании #2
"препод" и "член приемной комиссии" дожны наследоваться от класса "человек" виртуально
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Human {
//...
};
 
class Teacher : virtual public Human {
//...
};
 
class Examiner : virtual public Human {
//...
};
 
class TeacherAndExaminer : public Teacher, public Examiner {
//...
};
Mustik
56 / 56 / 2
Регистрация: 10.07.2011
Сообщений: 229
30.10.2011, 15:16     Ошибка при наследовании #3
Цитата Сообщение от Jupiter Посмотреть сообщение
"препод" и "член приемной комиссии" дожны наследоваться от класса "человек" виртуально
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Human {
//...
};
 
class Teacher : virtual public Human {
//...
};
 
class Examiner : virtual public Human {
//...
};
 
class TeacherAndExaminer : public Teacher, public Examiner {
//...
};
Примерно по теме:
В чем отличия виртуального наследования от невиртуального?
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
30.10.2011, 15:23  [ТС]     Ошибка при наследовании #4
Спасибо. Ошибки теперь нет. Но появились предупреждения. Что-то ему не нравится при наследовании в методах.
Пример предупреждения:
warning C4250: 'TeacherAndChPrKom' : inherits 'Teacher::Teacher::SetSpec' via dominance
Методы виртуальные.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.10.2011, 15:24     Ошибка при наследовании #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*При таком коде класс TeacherAndExaminer имеет в предках два класса Human 
один из которых принадлежит Teacher, другой - Examiner, потому имеется неоднозначность. 
В случае виртуального наследования класс TeacherAndExaminer имеет в предках один класс Human*/
class Human {
//...
};
 
class Teacher : public Human {
//...
};
 
class Examiner : public Human {
//...
};
 
class TeacherAndExaminer : public Teacher, public Examiner {
//...
};
Добавлено через 50 секунд
Цитата Сообщение от Riderik Посмотреть сообщение
Спасибо. Ошибки теперь нет. Но появились предупреждения. Что-то ему не нравится при наследовании в методах.
Пример предупреждения:
warning C4250: 'TeacherAndChPrKom' : inherits 'Teacher::Teacher::SetSpec' via dominance
Методы виртуальные.
покажите код
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
30.10.2011, 15:31  [ТС]     Ошибка при наследовании #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
class Human
{
protected:
    char *fam;
    char *name;
    char *otch;
    unsigned short year;
public:
    Human(char Fam[]="нету",char Name[]="нету", char Otch[]="нету", unsigned short Year=0);
    virtual ~Human();
    void SetFam(char Fam[]);
    void SetName(char Name[]);
    void SetOtch(char Otch[]);
    void SetYear(unsigned short Year);
    char *GetFam();
    char *GetName();
    char *GetOtch();
    unsigned short GetYear();
    //Virtual Pr
    virtual void SetDolj(char Dolj[]) {}
    virtual void SetNauchSt(char NauchSt[]){}
    virtual void SetSpec(char Spec[]) {}
    virtual void AddNT(char Name[]) {}
    virtual char *GetDolj() {return 0;}
    virtual char *GetNauchSt() {return 0;}
    virtual char *GetSpec(){return 0;}
    virtual strlist GetNauTr() {strlist a;return a;}
    //Virtual CPK
    virtual void SetNameKom(char NameKom[]){}
    virtual void SetYearKom(unsigned short yearKom){}
    virtual void SetNumSv(unsigned NumSv){}
    virtual void SetBio(char Bio[]) {}
    virtual char *GetNameKom() {return 0;}
    virtual unsigned short GetYearKom() {return 0;}
    virtual unsigned GetNumSv(){return 0;}
    virtual char *GetBio() {return 0;}
    //Virtual PrCPK
    virtual void AddRabKom(char RabKom[]) {}
    virtual strlist GetRabKom() {strlist a; return a;}
 
 
};
 
class Teacher : virtual public Human
{
protected:
    char *dolj;
    char *nauchSt;
    char *spec;
    strlist nauTr;
public:
    Teacher(char Fam[]="нету",char Name[]="нету", char Otch[]="нету", unsigned short Year=0, char Dolj[]="нету", char NauchSt[]="нету", char Spec[]="нету");
    ~Teacher();
    void SetDolj(char Dolj[]);
    void SetNauchSt(char NauchSt[]);
    void SetSpec(char Spec[]);
    void AddNT(char Name[]);
    char *GetDolj();
    char *GetNauchSt();
    char *GetSpec();
    strlist GetNauTr();
};
 
class ChPrKom: virtual public Human
{
protected:
    char *nameKom;
    unsigned short yearKom;
    unsigned numSv;
    char *bio;
public:
    ChPrKom(char Fam[]="нету",char Name[]="нету", char Otch[]="нету", unsigned short Year=0, char NameKom[]="нету", unsigned short YearKom=0, unsigned NumSv=0, char Bio[]="нету");
    ~ChPrKom();
    void SetNameKom(char NameKom[]);
    void SetYearKom(unsigned short yearKom);
    void SetNumSv(unsigned NumSv);
    void SetBio(char Bio[]);
    char *GetNameKom();
    unsigned short GetYearKom();
    unsigned GetNumSv();
    char *GetBio();
};
 
class TeacherAndChPrKom: public Teacher, public ChPrKom
{
protected:
    strlist rabKom;
public:
    TeacherAndChPrKom(char Fam[]="нету",char Name[]="нету", char Otch[]="нету", unsigned short Year=0, char Dolj[]="нету", char NauchSt[]="нету", char Spec[]="нету",char NameKom[]="нету", unsigned short YearKom=0, unsigned NumSv=0, char Bio[]="нету");
    ~TeacherAndChPrKom();
    void AddRabKom(char RabKom[]);
    strlist GetRabKom();
};
Yandex
Объявления
30.10.2011, 15:31     Ошибка при наследовании
Ответ Создать тему
Опции темы

Текущее время: 20:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru