Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/28: Рейтинг темы: голосов - 28, средняя оценка - 4.64
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
1

Наследование

08.03.2009, 23:34. Показов 5162. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Например, есть класс cA и его наследник – класс cB. В определении класса cB написали функцию func, а в её сигнатуре объект родительского класса. При использовании это функции компилятор пропускает, если в качестве параметра стоит объект класса cB.

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
#include <iostream>
using namespace std;
class cA
{
private:
    int a;
};
 
class cB: public cA
{
public:
    void func (cA & o)
    {
        cout << "func\n";
    }
};
 
int main ()
{
    cA a;
    cB b;
    b.func (b);
    b.func (a);
}
Это нормально, что компилятор пропускает, когда в объявлении функции func стоит класс cA, а при использовании этой функции используется наследник этого класса - класс cB или это может привести к каким-нибудь ошибкам?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.03.2009, 23:34
Ответы с готовыми решениями:

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

Наследование
Добрый вечер! Ребята, почему в данном примере #include &lt;iostream&gt; using namespace std; ...

Наследование
Здравствуйте! Написал код, не выдает никаких ошибок, но не работает. Может кто помочь сказать в...

Наследование
Реализовать наследование классов квартиры,этаж,подъезд,дом

16
Любитель давать советы
342 / 135 / 14
Регистрация: 12.01.2009
Сообщений: 511
08.03.2009, 23:47 2
Это очень даже нормально, так как всякий объект дочернего класса cB одновременно является полноценным объектом родительского класса .
Вот в обратную сторону - в общем случае нельзя.
0
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
10.03.2009, 00:48  [ТС] 3
Спасибо!
Я знаю что, конструкторы не наследуются, но если в классе есть конструктор, то надо ли его писать в классе-наследнике, если в нём нет указателей (если в обычных условия конструктор не нужен)?
0
Любитель давать советы
342 / 135 / 14
Регистрация: 12.01.2009
Сообщений: 511
10.03.2009, 10:17 4
Если базовый класс имеет конструктор по умолчанию, то наследник может обходиться без конструктора. Но если у базового класса конструктора по умолчанию нет, то потребуется создать хотя бы пустой конструктор в наследнике, потому что в нем нужно указать параметры, передаваемые в конструктор базового класса
0
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
11.03.2009, 01:14  [ТС] 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
class A
{
public:
    A ()
    {
        name = new char [15];
    }
    A (A & a)    // Конструктор копирования
    {
        name = new char [strlen (a.name)+1];
        strcpy (name, a.name);
    }
 
private:
    char* name;
};
 
class B: public A
{
private:
    int age;
};
В классе A есть конструктор копирования. Если рассматривать класс B не как наследник, а отдельный класс, то конструктор копирования не нужен:
C++
1
2
3
4
5
6
7
class B
{
private:
    int age;
};
У меня такой вопрос, в первом случае, где B – наследник, нужен конструктор копирования для B?
0
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
11.03.2009, 01:23 6
нет... конструктор вроде бы не нужен...

p.s: в конструкторе ты выделяешь память.. но она у тебя не освобождается.. создай деструктор и освобождай ее там.
0
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
11.03.2009, 15:47  [ТС] 7
А можно немного больше определённости - нужн точно или нет?
А этот пример только демонстрациооный, деструкторы в нём не обязательны
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
11.03.2009, 16:20 8
C++ неявно создает некоторые функции, тоесть
C++
1
class Empty {};
это будет равносильно
C++
1
2
3
4
5
6
7
8
9
class Empty {
public:
    Empty();// Конструктор по умолчанию
    Empty(const Empty& rhs);// Конструктор копирования
    ~Empty();// Деструктор
    Empty& operator = (const Empty& rhs);// Оператор присваивания
    Empty* operator&();// Операторы получения адреса
    const Empty* operator&() const;
};
0
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
11.03.2009, 23:55  [ТС] 9
Это немного не то.
Стандартный конструктор копирования работает плохо, если в классе есть данные-члены указатели. Меня интересует вопрос, нужен ли конструктор копирования в классе-наследнике, чтобы нормально скопировать указатели класса.
0
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
11.03.2009, 23:58 10
нет..конструктор и методы класса наследуются!
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
12.03.2009, 00:03 11
Я не могу понять ваш вопрос! Если в классе есть указатели, то конструктор копирования должен быть и оператор копирования тоже!
0
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
12.03.2009, 00:16  [ТС] 12
Кто тебе сказал, что конструкторы наследуются?
У меня возникает вопрос в том, вызывает ли класс-наследник конструктор, чтобы скопировать те данные-члены, которые относятся к тому классу.

Добавлено через 4 минуты 58 секунд
Не заметил новое сообщение.
Это и понятно. Нужен ли в классе-наследнике конструктор, чтобы скопировать данные-члены первого класса?
0
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
12.03.2009, 00:26 13
я просто учил ооп... если в производном класе не определен конструктор, то будет использоваться конструктор из базового класса (соответствующий запросу, если их несколько).
0
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
12.03.2009, 00:37  [ТС] 14
Это же не есть наследование. Это просто вызов конструктора для построения соответсвующих данных.
0
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
12.03.2009, 00:44 15
я тебя не пойму ... это не конструктор поумолчанию.. если ты в Классе А опишешь какой-то уникальный конструктор, а в классе В не упомянешь конструктор вообще, то тогда в классе В будет вызываться конструктор класса А
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
12.03.2009, 01:11 16
Цитата Сообщение от Don Corleone Посмотреть сообщение
я тебя не пойму ... это не конструктор по умолчанию.. если ты в Классе А опишешь какой-то уникальный конструктор, а в классе В не упомянешь конструктор вообще, то тогда в классе В будет вызываться конструктор класса А
я о том же ("может я просто перепил"). почитайте нужную литературу( на форуме валом )
0
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
12.03.2009, 01:17 17
ISergey, скорее наоборот, недопили
0
12.03.2009, 01:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.03.2009, 01:17
Помогаю со студенческими работами здесь

Наследование
Суть задачи: Реализуйте класс символьная строка,наследуйте от него класс двоичная строка....

Наследование
int main() { setlocale(LC_ALL, &quot;RUS&quot;); Stud FIRST_TRY; FIRST_TRY.set(); ...

Наследование
Доброе дня, прошу вас помочь в решение данной задачи.

наследование
Помогите разобраться в программе. Почему возникают такие ошибки cylindr.cpp expected `,' or `...'...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru