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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.76
.::.DIMA.::.
143 / 143 / 4
Регистрация: 26.10.2008
Сообщений: 782
#1

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

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

Например, есть класс 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 или это может привести к каким-нибудь ошибкам?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2009, 23:34     Наследование
Посмотрите здесь:

Наследование C++
C++ Наследование
C++ Наследование
C++ Наследование
Наследование C++
C++ Наследование
Наследование C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alexiski
Любитель давать советы
338 / 130 / 2
Регистрация: 12.01.2009
Сообщений: 511
08.03.2009, 23:47     Наследование #2
Это очень даже нормально, так как всякий объект дочернего класса cB одновременно является полноценным объектом родительского класса .
Вот в обратную сторону - в общем случае нельзя.
.::.DIMA.::.
143 / 143 / 4
Регистрация: 26.10.2008
Сообщений: 782
10.03.2009, 00:48  [ТС]     Наследование #3
Спасибо!
Я знаю что, конструкторы не наследуются, но если в классе есть конструктор, то надо ли его писать в классе-наследнике, если в нём нет указателей (если в обычных условия конструктор не нужен)?
Alexiski
Любитель давать советы
338 / 130 / 2
Регистрация: 12.01.2009
Сообщений: 511
10.03.2009, 10:17     Наследование #4
Если базовый класс имеет конструктор по умолчанию, то наследник может обходиться без конструктора. Но если у базового класса конструктора по умолчанию нет, то потребуется создать хотя бы пустой конструктор в наследнике, потому что в нем нужно указать параметры, передаваемые в конструктор базового класса
.::.DIMA.::.
143 / 143 / 4
Регистрация: 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?
Monte-Cristo
2786 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
11.03.2009, 01:23     Наследование #6
нет... конструктор вроде бы не нужен...

p.s: в конструкторе ты выделяешь память.. но она у тебя не освобождается.. создай деструктор и освобождай ее там.
.::.DIMA.::.
143 / 143 / 4
Регистрация: 26.10.2008
Сообщений: 782
11.03.2009, 15:47  [ТС]     Наследование #7
А можно немного больше определённости - нужн точно или нет?
А этот пример только демонстрациооный, деструкторы в нём не обязательны
ISergey
Maniac
Эксперт С++
1347 / 880 / 52
Регистрация: 02.01.2009
Сообщений: 2,645
Записей в блоге: 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;
};
.::.DIMA.::.
143 / 143 / 4
Регистрация: 26.10.2008
Сообщений: 782
11.03.2009, 23:55  [ТС]     Наследование #9
Это немного не то.
Стандартный конструктор копирования работает плохо, если в классе есть данные-члены указатели. Меня интересует вопрос, нужен ли конструктор копирования в классе-наследнике, чтобы нормально скопировать указатели класса.
Monte-Cristo
2786 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
11.03.2009, 23:58     Наследование #10
нет..конструктор и методы класса наследуются!
ISergey
Maniac
Эксперт С++
1347 / 880 / 52
Регистрация: 02.01.2009
Сообщений: 2,645
Записей в блоге: 1
12.03.2009, 00:03     Наследование #11
Я не могу понять ваш вопрос! Если в классе есть указатели, то конструктор копирования должен быть и оператор копирования тоже!
.::.DIMA.::.
143 / 143 / 4
Регистрация: 26.10.2008
Сообщений: 782
12.03.2009, 00:16  [ТС]     Наследование #12
Кто тебе сказал, что конструкторы наследуются?
У меня возникает вопрос в том, вызывает ли класс-наследник конструктор, чтобы скопировать те данные-члены, которые относятся к тому классу.

Добавлено через 4 минуты 58 секунд
Не заметил новое сообщение.
Это и понятно. Нужен ли в классе-наследнике конструктор, чтобы скопировать данные-члены первого класса?
Monte-Cristo
2786 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
12.03.2009, 00:26     Наследование #13
я просто учил ооп... если в производном класе не определен конструктор, то будет использоваться конструктор из базового класса (соответствующий запросу, если их несколько).
.::.DIMA.::.
143 / 143 / 4
Регистрация: 26.10.2008
Сообщений: 782
12.03.2009, 00:37  [ТС]     Наследование #14
Это же не есть наследование. Это просто вызов конструктора для построения соответсвующих данных.
Monte-Cristo
2786 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
12.03.2009, 00:44     Наследование #15
я тебя не пойму ... это не конструктор поумолчанию.. если ты в Классе А опишешь какой-то уникальный конструктор, а в классе В не упомянешь конструктор вообще, то тогда в классе В будет вызываться конструктор класса А
ISergey
Maniac
Эксперт С++
1347 / 880 / 52
Регистрация: 02.01.2009
Сообщений: 2,645
Записей в блоге: 1
12.03.2009, 01:11     Наследование #16
Цитата Сообщение от Don Corleone Посмотреть сообщение
я тебя не пойму ... это не конструктор по умолчанию.. если ты в Классе А опишешь какой-то уникальный конструктор, а в классе В не упомянешь конструктор вообще, то тогда в классе В будет вызываться конструктор класса А
я о том же ("может я просто перепил"). почитайте нужную литературу( на форуме валом )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2009, 01:17     Наследование
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Monte-Cristo
2786 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
12.03.2009, 01:17     Наследование #17
ISergey, скорее наоборот, недопили
Yandex
Объявления
12.03.2009, 01:17     Наследование
Ответ Создать тему
Опции темы

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