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

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

Войти
Регистрация
Восстановить пароль
 
Игорюня
20 / 16 / 7
Регистрация: 07.12.2013
Сообщений: 244
#1

Конструкторы базового и производного класса - C++

09.03.2014, 12:19. Просмотров 1018. Ответов 14
Метки нет (Все метки)

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
class first
{
public:
        first(int a):first(a){}
    void Setfirst(int a){first=a;}
    int Getfirst(){return first;}
private:
    int first;
};
 
 
class second : public first
{
public:
        second(int,int);
    void Setsecond(int a){second=a;}
    int Getsecond(){return second;}
private:
    int second;
};
 
second::second(int a,int b):first(b)
{
second=a;
}
Если создаю конструкторы в классах,то компилятор начинается ругаться:

error C2380: типы перед "first" (конструктор с возвращаемым типом или недопустимое переопределение текущего имени класса?)
error C2513: first: нет переменных, объявленных перед "="
error C2275: first: недопустимое использование этого типа в качестве выражения
error C2380: типы перед "second" (конструктор с возвращаемым типом или недопустимое переопределение текущего имени класса?)
error C2513: second: нет переменных, объявленных перед "="
error C2275: second: недопустимое использование этого типа в качестве выражения
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.03.2014, 12:19     Конструкторы базового и производного класса
Посмотрите здесь:
C++ Вызов метода производного класса через обращение к методу базового класса
C++ Создание указателя типа базового класса на экземпляр производного класса
Указатель на объект базового класса и адрес объекта производного класса C++
Определить обработчик исключений на преобразование указателя базового класса на указатель производного класса C++
Вызов объектом базового класса функцию из производного класса! C++
C++ Использование перегруженного оператора ввода/вывода в поток базового класса для объекта производного класса
как сделать чтобы объект производного класса сам себя добавлял в список или массив указателей базового класса? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
6282 / 5885 / 1906
Регистрация: 18.12.2011
Сообщений: 15,099
Завершенные тесты: 1
09.03.2014, 12:31     Конструкторы базового и производного класса #2
Нельзя называть члены класса так же, как и класс.
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
class first
{
public:
        first(int a):f(a){}
    void Setfirst(int a){f=a;}
    int Getfirst(){return f;}
private:
    int f;
};
 
 
class second : public first
{
public:
        second(int,int);
    void Setsecond(int a):first(0){s=a;}
    int Getsecond(){return s;}
private:
    int s;
};
 
second::second(int a,int b):first(b)
{
s=a;
}
Игорюня
20 / 16 / 7
Регистрация: 07.12.2013
Сообщений: 244
09.03.2014, 12:40  [ТС]     Конструкторы базового и производного класса #3
Ещё вопрос:если я создаю конструктор в производном классе,то я обязан вызывать через него базовый класс?
zss
Модератор
Эксперт С++
6282 / 5885 / 1906
Регистрация: 18.12.2011
Сообщений: 15,099
Завершенные тесты: 1
09.03.2014, 12:45     Конструкторы базового и производного класса #4
Не то, чтобы обязаны,
но Вы можете не знать, что именно делает конструктор базового класса,
так что лучше его вызвать.
Игорюня
20 / 16 / 7
Регистрация: 07.12.2013
Сообщений: 244
09.03.2014, 13:06  [ТС]     Конструкторы базового и производного класса #5
Цитирую:Если элемент является защищенным, объекты производного класса могут обращаться к нему, как будто он является общим. Для оставшейся части вашей программы защищенные элементы являются как бы частными.

C++
1
2
3
4
5
6
7
8
9
class first
{
public:
    first(int a):First(a){}
    void Setfirst(int a){First=a;}
    int Getfirst(){return First;}
protected:
    int First;
};
Потом я создаю объект производного класса и пытаюсь изменить переменную базового класса,но компилятор не разрешает.

second object;
object.First=10;
zss
Модератор
Эксперт С++
6282 / 5885 / 1906
Регистрация: 18.12.2011
Сообщений: 15,099
Завершенные тесты: 1
09.03.2014, 14:07     Конструкторы базового и производного класса #6
Поменяйте тип доступа к переменной базового класса с private на protected.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
09.03.2014, 15:08     Конструкторы базового и производного класса #7
Цитата Сообщение от zss Посмотреть сообщение
Поменяйте тип доступа к переменной базового класса с private на protected.
Она и так protected:
Цитата Сообщение от Игорюня Посмотреть сообщение
protected: int First;
Просто чтобы присваивание типа:
Цитата Сообщение от Игорюня Посмотреть сообщение
object.First=10;
работало, оно должно вызываться из функции члена second.
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
09.03.2014, 15:39     Конструкторы базового и производного класса #8
Цитата Сообщение от Игорюня Посмотреть сообщение
если я создаю конструктор в производном классе,то я обязан вызывать через него базовый класс?
Цитата Сообщение от zss Посмотреть сообщение
Не то, чтобы обязаны,
но Вы можете не знать, что именно делает конструктор базового класса,
так что лучше его вызвать.
чего-чего? если конструктор базового класса принимает параметры, то да обязан
zss
Модератор
Эксперт С++
6282 / 5885 / 1906
Регистрация: 18.12.2011
Сообщений: 15,099
Завершенные тесты: 1
09.03.2014, 16:44     Конструкторы базового и производного класса #9
Цитата Сообщение от Jupiter Посмотреть сообщение
если конструктор базового класса принимает параметры, то да обязан
Если известно, что с этими параметрами делать, то весь код можно написать в конструкторе производного
класса (разве, что не получится инициализировать private данные базового класса).
Но, еще раз повторяю, лучше вызвать конструктор базового класса,
Игорюня
20 / 16 / 7
Регистрация: 07.12.2013
Сообщений: 244
10.03.2014, 06:01  [ТС]     Конструкторы базового и производного класса #10
Tulosba, то есть,чтобы изменить protected член базового класса через объект производного,нужно сделать это через метод производного?Я не понял.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
10.03.2014, 08:32     Конструкторы базового и производного класса #11
Игорюня,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
 
class B {
public:
   void print() const { cout << prot << endl; }
protected:
   int prot = 42;
};
 
class D : public B {
public:
   void mod(int v) { prot = v; }
};
 
int main() {
   D d;
   d.print();
   d.mod(100500);
   d.print();
   return 0;
}
http://ideone.com/NhxDf5
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2014, 08:46     Конструкторы базового и производного класса #12
Цитата Сообщение от Игорюня Посмотреть сообщение
Цитирую:Если элемент является защищенным, объекты производного класса могут обращаться к нему, как будто он является общим.
Откуда цитата? Может не объекты производного класса, а элементы производного класса (т.е., в методах производного класса)? При открытом наследовании защищенные элементы базового класса становятся защищёнными элементами производного, а значит доступ к ним, из внешнего мира, только через методы класса.

Добавлено через 9 минут
Цитата Сообщение от Игорюня Посмотреть сообщение
то есть,чтобы изменить protected член базового класса через объект производного,нужно сделать это через метод производного?Я не понял.
Можно и так, можно и через метод базового, находящийся в публичном разделе:
C++
1
2
second object;
object.Setfirst(10);
Игорюня
20 / 16 / 7
Регистрация: 07.12.2013
Сообщений: 244
10.03.2014, 10:00  [ТС]     Конструкторы базового и производного класса #13
Просто из цитаты решил,что можно обращаться напрямую.

Добавлено через 9 минут
Тогда чем же отличается private от protected,если и там и там нам необходимо обращаться через методы?

Добавлено через 3 минуты
Уже разобрался.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2014, 10:01     Конструкторы базового и производного класса #14
Цитата Сообщение от Игорюня Посмотреть сообщение
Тогда чем же отличается private от protected,если и там и там нам необходимо обращаться через методы?
Если prot будет приват, то так уже не напишите (пример Tulosba):
C++
1
2
3
4
class D : public B {
public:
   void mod(int v) { prot = v; }
};
То есть, в методах производного (как говорят: внутри класса) можно напрямую обращаться к защищённым элементам базового класса(prot = v), к приватным элементам базового - только через методы базового класса.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2014, 11:53     Конструкторы базового и производного класса
Еще ссылки по теме:
Вызов методов производного класса из базового C++
C++ Объекты производного класса не наследуют методы базового
Наследование: почему вызывается метод базового класса, а не производного? C++
Вызов виртуального метода базового класса из указателя производного C++
Можно ли из базового класса обратится к виртуальному методу производного? C++

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

Или воспользуйтесь поиском по форуму:
zss
Модератор
Эксперт С++
6282 / 5885 / 1906
Регистрация: 18.12.2011
Сообщений: 15,099
Завершенные тесты: 1
10.03.2014, 11:53     Конструкторы базового и производного класса #15
Цитата Сообщение от Игорюня Посмотреть сообщение
то есть,чтобы изменить protected член базового класса через объект производного,нужно сделать это через метод производного?
Не нужно, а можно (право имеете)!
Yandex
Объявления
10.03.2014, 11:53     Конструкторы базового и производного класса
Ответ Создать тему
Опции темы

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