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

Почему не работает наследование? - C++

Восстановить пароль Регистрация
 
Вероника99
4 / 4 / 1
Регистрация: 16.12.2013
Сообщений: 412
05.04.2014, 20:45     Почему не работает наследование? #1
Пытаюсь присвоить полям производного класса поля базового,но выводит мусор. В чем проблема?
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
#include "stdafx.h"
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
 
using namespace std;
 
class three
{
protected:
    int a;
    int b;
    int c;
public:
    three(int aa,int bb,int cc)
    {
        a=aa;
        b=bb;
        c=cc;
    }
    void showy()
    {
        cout<<" "<<a<<" "<<b;
 
    }
    
//  ~three(){}
};
 
class kvadr :public three
{
protected:
    int aaa;
    int bbb;
    int ccc;
    int D;
public:
    kvadr(int dd):three(a,b,c)
    {
        aaa=a;
        bbb=b;
        ccc=c;
        D=dd;
        cout<<""<<aaa;
    }
    void result()
    {
        int D=bbb*bbb-4*aaa*ccc;
        cout<<" "<<D;
    }
    void show()
    {
        cout<<" "<<aaa<<" "<<bbb;
    }
//  ~kvadr(){}
};
int main(void)
{
    three A(1,3,-4);
    A.showy();
    kvadr B(0);
 
    B.show();
//  B.result();
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
05.04.2014, 20:50     Почему не работает наследование? #2
Цитата Сообщение от Вероника99 Посмотреть сообщение
kvadr(int dd):three(a,b,c)
строка 39
здесь вы пытаетесь инициализировать a b c базового класса этими же a b c этого же базового класса, в которых изначально мусор.
Может так
C++
1
2
3
4
5
kvadr(int a_, int b_, int c_, int dd):three(a_,b_,c_)
    {
        D=dd;
        cout<<""<<aaa;
    }
Вероника99
4 / 4 / 1
Регистрация: 16.12.2013
Сообщений: 412
05.04.2014, 21:00  [ТС]     Почему не работает наследование? #3
Т.е. чтобы скопировать поля базового класса в поля производного,нужно создавать функции доступа?А нельзя через конструктор копирования?Я когда делаю конструктор копирование,выдает ошибку
three A(1,3,-4);

kvadr B(А);
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,165
Завершенные тесты: 1
05.04.2014, 21:49     Почему не работает наследование? #4
Цитата Сообщение от Вероника99 Посмотреть сообщение
kvadr B(А);
Это не копиконструктор. A и B - разные классы.
Можете, конечно, написать дополнительный конструктор,
который создает экземпляр производного класса на основе экземпляра базового.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.04.2014, 21:52     Почему не работает наследование? #5
Цитата Сообщение от Вероника99 Посмотреть сообщение
Т.е. чтобы скопировать поля базового класса в поля производного,нужно создавать функции доступа?
Зачем это, вообще, делать, если в объекте производного класса присутстуют поля и базового класса? Из пустого в порожнее переливать?
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,165
Завершенные тесты: 1
05.04.2014, 21:54     Почему не работает наследование? #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
class three
{
....
three(three& x)// копиконструктор
{
    a=x.a;b=x.b;c=x.c;
}
....
};
class kvadr
{
protected:
    //int aaa; -это похоже Ваша попытка дублировать члены базового класса
    //int bbb; -это похоже Ваша попытка дублировать члены базового класса
    //int ccc; -это похоже Ваша попытка дублировать члены базового класса
    int D;
....
kvadr(three& x):three(x)
{
        D=x.D;
}
kvadr(kvadr& x):three(x.a,x.b,x.c) // копиконструктор
{
        D=x.D;
}
....
};
Вероника99
4 / 4 / 1
Регистрация: 16.12.2013
Сообщений: 412
06.04.2014, 15:54  [ТС]     Почему не работает наследование? #7
Я что-то не понимаю, при наследовании поля базового класса наследуются производному классу,т.е в производном классе мы можем использовать поля базового класса.Но когда я в производном классе обращаюсь к полям базового класса,выводит мусор. Например здесь: (в main я объявляю объект класса "квадр" и передаю 0)
C++
1
2
3
4
5
kvadr(int dd):three(a,b,c)
    {
        d=dd;
       cout<<" "<<a;
    }
На месте "а" выводит мусор
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,165
Завершенные тесты: 1
06.04.2014, 18:04     Почему не работает наследование? #8
Про это Вам уже говорили. Поскольку начальные значения для a,b,c в конструкторе не даны,
то вызвать можно только конструктор без параметров three() (который кстати в базовом классе Вы забыли).
Или задать какие-то константы:
C++
1
2
3
4
kvadr(int dd):three(0,0,0)
{
    d=dd;
}
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
#include <iostream>
using namespace std;
class three
{
protected:
    int a;
    int b;
    int c;
public:
    three(int aa,int bb,int cc)
    {
        a=aa;
        b=bb;
        c=cc;
    }
    three()
    {
        a=0;
        b=0;
        c=0;
    }
    three(three& T)
    {
        a=T.a;
        b=T.b;
        c=T.c;
    }
    void show()
    {
        cout<<"a= "<<a<<" b= "<<b<<endl;
 
    }
};
 
class kvadr :public three
{
private:
    int D;
public:
    kvadr():three() // конструктор без параметров
    {
        D=0;
    }
    kvadr(int dd):three()
    {
        D=dd;
    }
    kvadr(int dd,int aa,int bb,int cc):three(aa,bb,cc)// конструктор со всеми параметрами
    {
        D=dd;
    }
    kvadr(kvadr&T):three(T.a,T.b,T.c)  // копиконструктор
    {
        D=T.D;
    }
    void result()
    {
        int X=b*b-4*a*c;
        cout<<" "<<X;
    }
    void show()
    {
        cout<<"D= "<<D<<endl;
        three::show();
    }
};
int main(void)
{
    three A(1,3,-4);
    A.show();
    kvadr B(0,1,2,3);
    B.show();
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2014, 19:25     Почему не работает наследование?
Еще ссылки по теме:

C++ Почему не работает if-else
Пояснить, почему в примере не рекомендуется использовать закрытое наследование C++
Наследование: почему вызывается метод базового класса, а не производного? C++

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

Или воспользуйтесь поиском по форуму:
Вероника99
4 / 4 / 1
Регистрация: 16.12.2013
Сообщений: 412
07.04.2014, 19:25  [ТС]     Почему не работает наследование? #9
Ааа я поняла, значения объекта ведь не закрепляются в классе,я все перепутала. Спасибо за помощь)
Yandex
Объявления
07.04.2014, 19:25     Почему не работает наследование?
Ответ Создать тему
Опции темы

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