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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 90, средняя оценка - 4.82
Robbi
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 11
#1

Наследование конструкторов? - C++

02.11.2009, 14:10. Просмотров 11729. Ответов 8
Метки нет (Все метки)

Сдаю лабораторную на тему наследования в С++ :
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
#include <iostream>
using namespace std;
 
class hero {
protected:
    int jiv;
    int pow;
public:
    hero(int j, int p)
    {
        jiv = j;
        pow = p;
    }
    virtual void show()
    {
        printf("jiv: %d\npower: %d\n",jiv,pow);
    }
};
 
// В классе Y, i и j класса X становятся защищёнными членами
class mif: public hero {
    int vel;
    int magic;
public:
    mif(int j, int p, int v, int m):hero(j,p)
    {
        vel = v;
        magic = m;
    }
    void show()
    {
        printf("jiv: %d\npower: %d\nvelocity: %d\nmagic: %d\n",jiv,pow,vel,magic);
    }
};
class chel: public hero {
    int ver;
    int ud;
public:
    chel(int j, int p, int v, int u):hero(j,p)
    {
        ver = v;
        ud = u;
    }
    void show()
    {
        printf("jiv: %d\npower: %d\nvernost': %d\nuda4a: %d\n",jiv,pow,ver,ud);
    }
};
void show_who(hero &r) {
    r.show();
}
 
int main()
{
    int i,j,k,l;
    printf ("vvedite jiv,pow,vel, magic: ");
    scanf("%d %d %d %d",&i,&j,&k,&l);
    mif m(i,j,k,l);
    m.show();
    chel c(100,100,100,2);
    c.show();
 
    show_who(m);
    show_who(c);
 
 
    return 0;
}
Вопрос препода: ПОЧЕМУ НЕ наследуются конструкторы? Или это возможно??
Сижу щас, мучаюсь, нигде не могу найти ответ :-((
Подскажите плз, пожалуйста! Заранее спасибо)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Андрейка
419 / 223 / 27
Регистрация: 25.03.2009
Сообщений: 744
02.11.2009, 14:19     Наследование конструкторов? #2
нет конструторы не наследуются ты их вызываешь в конструкторе производного класса в списке инициализации.
Robbi
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 11
02.11.2009, 14:23  [ТС]     Наследование конструкторов? #3
Ничего, ошибок нет, все вроде выполняется корректно...
Андрейка, отвечал уже так, ответ не устраивет.
Нвужно ответить, именно ПОЧЕМУ не наследуется..
oxotnik
 Аватар для oxotnik
1586 / 1063 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
02.11.2009, 14:44     Наследование конструкторов? #4
Если в классе нет определенных пользователем конструкторов, то компилятор сам генерирует конструктор по умолчанию, который вызывает дефолтные конструкторы базовых классов. Если определен хотя бы один пользовательский конструктор, то конструктор по умолчанию не генерируется.
fktrctq0321
0 / 0 / 0
Регистрация: 10.05.2013
Сообщений: 37
13.12.2013, 01:20     Наследование конструкторов? #5
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 "stdafx.h"
#include "iostream"
#include "math.h"
#include <conio.h>
using namespace std;
 
                        // variant 50
class money              // 2.4
{
    unsigned long hrn;
    unsigned int kop;
public:
    void set_cash(unsigned long _hrn, unsigned int _kop)
    {
        this->hrn=_hrn;
        this->kop=_kop%100;
        this->hrn=_hrn+_kop/100;
    }
 
    money::money()
    {
        unsigned long temp_hrn;
        unsigned int temp_kop;
 
        cout << "Введите сумму гривен и копеек:\n";
        cin >> temp_hrn;
        cin >> temp_kop;
        this->set_cash(temp_hrn,temp_kop);
    }
 
    virtual void output() const
    {
        cout << "\nВаш баланс: " << this->hrn << " грн " << this->kop << " коп" << endl;
    }
 
};
 
class figure: public money      //2.3
{
    int a;
public:
    void set_a(int _a)
    {
        this->a=_a;
    }
    
    figure::figure()
    {
        int temp_a;
        cout << "\nВведите число:" << endl;
        cin>>temp_a;
        this->set_a(temp_a);
 
    }
 
    virtual void output() const
    {
        cout << "\nВведеное число: " << this->a << endl;
    }
};
 
int main()
{
    setlocale(LC_ALL, "Rus");
    
    money cash;
    figure number;
 
    money *c1 = &cash;
    c1->output();
    c1=&number;
    c1->output();
}
Ребят, помогите, пожалуйста. Разбираюсь сейчас с виртуальными методами. Вроде разобрался. НО! Как сделать так, что в производный класс (дочерний) не наследовался конструктор? т.е. у меня 2 раза запрашивается ввод баланса в данном случае (1-ый раз - в базовом классе, 2-ой раз - уже в производном)
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12534 / 7096 / 797
Регистрация: 27.09.2012
Сообщений: 17,508
Записей в блоге: 2
Завершенные тесты: 1
13.12.2013, 01:22     Наследование конструкторов? #6
Цитата Сообщение от fktrctq0321 Посмотреть сообщение
т.е. у меня 2 раза запрашивается ввод баланса в данном случае (1-ый раз - в базовом классе, 2-ой раз - уже в производном)
подумайте над тотальным изменением структуры программы!
fktrctq0321
0 / 0 / 0
Регистрация: 10.05.2013
Сообщений: 37
13.12.2013, 01:24     Наследование конструкторов? #7
Цитата Сообщение от Croessmah Посмотреть сообщение
подумайте над тотальным изменением структуры программы!
а исправить "корявость" здесь никак нельзя?
упор в задании делается на виртуальные методы, это уже для корректности и для глаза
DU
1479 / 1055 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.12.2013, 01:32     Наследование конструкторов? #8
по мне - так запрашивать данные в конструкторах - это моветон какой-то.
лучше сделать конструкторы без или же конструкторы с интовыми параметрами или что вы там запрашиваете.
так вот делать запрос на ввод вне конструктора и когда данные ввели - создавать инстанс, передавая в конструктор введенные данные или же сетить данные через публичные методы.
псевдокод:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int data = 0;
std::cout << "Enter data: ";
std::cin >> data;
 
MyClass myClass(data);
...
 
 
 
или
int data = 0;
std::cout << "Enter data: ";
std::cin >> data;
 
MyClass myClass;
myClass.setData(data);
...
в конструкторах запрашивать плохо, потому что таким образом хардкодится способ консруирования класса
и по другому инстанс создать нельзя. а ведь данные откуда угодно могут быть получены. могут быть запрошены, могут быть прочитаны из файла, могут быть вычислены и т.п.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2014, 21:50     Наследование конструкторов?
Еще ссылки по теме:

C++ Наследование конструкторов с параметрами и деструктора
Наследование конструкторов классов C++
C++ Наследование - вызов конструкторов и деструкторов
Наследование конструкторов C++
C++ наследование классов и использование конструкторов

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

Или воспользуйтесь поиском по форуму:
Extazzy777
0 / 0 / 0
Регистрация: 20.05.2014
Сообщений: 5
20.05.2014, 21:50     Наследование конструкторов? #9
ну, а если при наследовании классов отсутствует конструктор в базовом классе, то что тогда?
Yandex
Объявления
20.05.2014, 21:50     Наследование конструкторов?
Ответ Создать тему
Опции темы

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