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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
DimaGerrard
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 11
#1

Наследование - C++

09.01.2012, 12:00. Просмотров 898. Ответов 20
Метки нет (Все метки)

Помогите пожалуйста найти ошибку в коде.
Тема: Наследование классов и виртуальные функции.
Ошибка заключается в том, что переменные из первого класса не передаются во второй, хотя по идее имеют свойства protected (public тоже пробовал), а тип наследования public.
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
94
95
96
97
98
99
100
101
102
103
104
#include "stdafx.h"
#include <iostream>
using namespace std;
 
class detail
{
protected:
    int n,i;
    struct obj
    {
        char det[20];
        int nomc,kold;
        char ak[5];
        int na,kf;
    };
    obj ob[20];
public:
    detail();
    ~detail()
    {cout<<"\nObject delete!\n";}
    void zapp();
    void func();
    virtual void vfunc();
};
detail::detail()
{
    i=0;
}
void detail::zapp()
{
    cout<<"Vvedite koli4estvo zapisei:";
    cin>>n;
    for (i=0; i<n; i++)
    {
        cout<<"Vvedite detal':";
        cin>>ob[i].det;
        cout<<"Vvedite koli4estvo detalei:";
        cin>>ob[i].kold;
        cout<<"Vvedite nomer cexa:";
        cin>>ob[i].nomc;
    }
}
void detail::func()
{
    char wed[20];
    cout<<"Vvedite interesuemuyu detal':";
    cin>>wed;
    for (i=0; i<n; i++)
    {
        if (strcmp(ob[i].det,wed)==0)
            cout<<"Koli4estvo dannyx detalei:"<<ob[i].kold;
    }
}
void detail::vfunc()
{
    cout<<"\nSoderzhimoe objecta:\nDetal'     Koli4estvo     Nomer cexa"<<endl;
    for (i=0; i<n; i++)
    {
        cout<<endl<<ob[i].det<<"               "<<ob[i].kold<<"               "<<ob[i].nomc;
    }
}
 
class ndetail: public detail
{
public:
    void zap();
    void vfunc();
};
void ndetail::zap()
{
    cout<<"\nVvedite dopolnitelnie dannye:\n";
    cout<<i<<" "<<n;
    for (i=0; i<n; i++)
        {
            cout<<"Imeet li detal' '"<<ob[i].det<<"' antikoroziinoe pokrytie? ";
            cin>>ob[i].ak;
            cout<<"Vvedite koefficient nadezhnosti dannoi detali: ";
            cin>>ob[i].kf;
        }
}
void ndetail::vfunc()
{
    cout<<"\nSostoyanie detalei:\nDetal'     Nali4ie antikora     Koefficient nadezhnosti";
    for (i=0; i<n; i++)
    {
        cout<<endl<<ob[i].det<<"             "<<ob[i].ak<<"                "<<ob[i].kf<<"%";
    }
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    detail *p,b;
    ndetail s;
    p=&b;
    p->zapp();
    p->func();
    p->vfunc();
    p=&s;
    s.zap();
    s.vfunc();
    cout<<endl;
    system("pause");
    return 0;
}
0
Миниатюры
Наследование  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2012, 12:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование (C++):

Заменить наследование классов на наследование интерфейсов - C++
#include &lt;iostream&gt; #include &lt;assert.h&gt; using namespace std; int people_on_base = 100; int vehicles_on_base = 100; double...

Наследование - C++
char* Texts :: SetBit() { char a; int b; cout &lt;&lt; &quot;Получаем битовую строку&quot; &lt;&lt; endl; cin &gt;&gt; a; b = strlen(a);...

наследование - C++
Пытаюсь разобраться в наследовании Есть класс class File { public: struct comp { char num; // Имя переменной char st;...

Наследование - C++
Всем привет. Может кто нибудь подсказать с чего начать при создании класса для работы с файлами на подобии ostream( а точнее как правильно...

наследование - C++
определить базовый класс ''точка''. Затем от него определить два произвольных класса ''прямоугольник'' и ''параллелепипед'', в каждом из...

Наследование?! - C++
привет всем. Есть класс Circle c1, c2, c3 Нужно реализовать через наследование класс множество, прошу помочь как он будет выглядеть...

20
DimaGerrard
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 11
09.01.2012, 12:40  [ТС] #16
Цитата Сообщение от silent_1991 Посмотреть сообщение

Не по теме:

Хм, интересная тенденция - к сессии все преподы страны становятся напрочь тупыми и них... не знающими... Сказываются праздники? Или всё же надо думать, что не преподы них не знают, а студенты них не слушают? Может наши преподы не все поголовно такие плохие?

Хорошее замечание, но в данном случае такая ситуация наблюдается на протяжении всего семестра, а не ближе к сессии. Просто когда я подошел к преподу и сказал "Я сделал все как вы мне сказали, покажите мне мою ошибку" он даже смотреть не стал, а сказал "Ну у остальных групп все работает, так что ...". Причем с моей группы никто так и не сделал, а тех людей с других групп я не нашёл.

Добавлено через 2 минуты
Я понял ваши замечания и переделал программу, но от этого данные как не передавались во второй класс, так и не передаются. Гляньте плиз может я что-то с наследованием затупил, но вроде как правильно...
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.01.2012, 12:47 #17
DimaGerrard, проблема в том, что у вас напрочь неверная архитектура. Например, у вас класс "Деталь" почему-то хранит массив каких-то obj. Давайте сделаем так: мне совершенно неохота разбираться во всём этом. Вы пишите задание, я пишу верный код, вы задаёте вопросы, я отвечаю. Просто легче написать заново правильный код, чем переделывать этот.
0
DimaGerrard
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 11
09.01.2012, 12:57  [ТС] #18
silent 1991, ну это массив объектов структуры, объявленной выше.
Но можно поступить как и ты сказал.
Задание:
Создайте программу с классом Detail, который включает следующие данные:
- наименование детали;
- количество деталей;
- номер цеха-изготовителя.
В состав класса входят следующие функции:
- конструктор с параметрами;
- деструктор;
- функция, которая вычисляет общее количество изделий указанного наименования;
- виртуальная функция просмотра состояния текущего объекта.
Производный класс содержит следующие элементы:
- наличие дополнительного антикоррозийного покрытия;
- коэффициент надежности в процентах;
- переопределенную функцию просмотра текущего состояния деталей.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.01.2012, 13:16 #19
Что-то в этом роде:
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
#include <iostream>
#include <string>
 
class Detail
{
public:
    Detail(const std::string& name, size_t count, int number):
    m_name(name),
    m_count(count),
    m_number(number)
    {
    }
    
    virtual ~Detail()
    {
    }
    
    size_t count() const
    {
        return m_count;
    }
    
    virtual void print_state() const
    {
        std::cout << "Name: " << m_name << "; "
                  << "Count: " << m_count << "; "
                  << "Number: " << m_number;
    }
    
private:
    std::string m_name;
    size_t m_count;
    int m_number;
};
 
class ExtendedDetail : public Detail
{
public:
    ExtendedDetail(const std::string& name, size_t count, int number, bool protection, int safety):
    Detail(name, count, number),
    m_protection(protection),
    m_safety(safety)
    {
    }
    
    virtual ~ExtendedDetail()
    {
    }
    
    virtual void print_state() const
    {
        Detail::print_state();
        
        std::cout << "; Corrosion protection: " << m_protection << "; "
                  << "Safety factor: " << m_safety;
    }
    
private:
    bool m_protection;
    int m_safety;
};
 
void print_detail_state(const Detail& detail)
{
    detail.print_state();
    
    std::cout << std::endl;
}
 
int main()
{
    Detail d1("Detail 1", 10, 3);
    ExtendedDetail d2("Detail 2", 12, 8, true, 87);
    
    print_detail_state(d1);
    print_detail_state(d2);
    
    return 0;
}
1
DimaGerrard
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 11
09.01.2012, 13:35  [ТС] #20
silent 1991, спасибо большое, постараюсь разобраться в твоем коде)
Но, впринципе, я понял свою главную ошибку: виртуальная функция первого класса будет работать с данными, внесенными только в первом классе, а вторая - с данными только второго.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.01.2012, 13:37 #21
DimaGerrard, нет, суть виртуальности не в этом. Вы могли работать в виртуальной функции наследника с защищёнными или открытыми данными родителя.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2012, 13:37
Привет! Вот еще темы с ответами:

наследование - C++
Как наследовать классы с использованием виртуальных функций? Можете привести пример?

наследование в С++ - C++
Добрый вечер. относительно недавно мною была получена задача, а точнее несколько задач в одной...И как это ни печально звучит, проблемы...

наследование - C++
помогите пожалуйсто дописать класс многоугольников , и рисовать на монитор с помощью mfc , заранее благодарен... class figure{ public: ...

Наследование в C++ - C++
Прошу помощи, ибо С++ не моё, а лабораторные работы девушке сдавать надо: Создать 1 базовый класс и несколько производных. Все...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
21
Yandex
Объявления
09.01.2012, 13:37
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru