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

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

Восстановить пароль Регистрация
 
Игорюня
 Аватар для Игорюня
20 / 16 / 7
Регистрация: 07.12.2013
Сообщений: 244
09.03.2014, 12:19     Конструкторы базового и производного класса #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
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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,155
Завершенные тесты: 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
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,155
Завершенные тесты: 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
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,155
Завершенные тесты: 1
09.03.2014, 14:07     Конструкторы базового и производного класса #6
Поменяйте тип доступа к переменной базового класса с private на protected.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
09.03.2014, 15:08     Конструкторы базового и производного класса #7
Цитата Сообщение от zss Посмотреть сообщение
Поменяйте тип доступа к переменной базового класса с private на protected.
Она и так protected:
Цитата Сообщение от Игорюня Посмотреть сообщение
protected: int First;
Просто чтобы присваивание типа:
Цитата Сообщение от Игорюня Посмотреть сообщение
object.First=10;
работало, оно должно вызываться из функции члена second.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
09.03.2014, 15:39     Конструкторы базового и производного класса #8
Цитата Сообщение от Игорюня Посмотреть сообщение
если я создаю конструктор в производном классе,то я обязан вызывать через него базовый класс?
Цитата Сообщение от zss Посмотреть сообщение
Не то, чтобы обязаны,
но Вы можете не знать, что именно делает конструктор базового класса,
так что лучше его вызвать.
чего-чего? если конструктор базового класса принимает параметры, то да обязан
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,155
Завершенные тесты: 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
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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
5282 / 4801 / 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
5282 / 4801 / 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++

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

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

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