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

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

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

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

09.03.2014, 12:19. Просмотров 1093. Ответов 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: недопустимое использование этого типа в качестве выражения
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.03.2014, 12:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конструкторы базового и производного класса (C++):

Вызов метода производного класса через обращение к методу базового класса - C++
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать классы внутри main.cpp, то всё нормально. Если же создавать в...

Указатель на объект базового класса и адрес объекта производного класса - C++
Пример кода: class Class1 { public: Class1(int x) { j = new int; *j = x; } ~Class1() {delete j;}

Создание указателя типа базового класса на экземпляр производного класса - C++
Добрый день! Иногда видел коды, где создавался указатель типа базового класса на объект класса - наследника, для чего это может применяться?

Определить обработчик исключений на преобразование указателя базового класса на указатель производного класса - C++
Класс В является производным от класса А. Определить обработчик исключительной ситуации на преобразование указателя базового класса А на...

Вызов объектом базового класса функцию из производного класса! - C++
Как можно осуществить вызов или передачу значения в базовый класс для дальнейшего вычисления этого значения в производном классе. Вот...

Использование перегруженного оператора ввода/вывода в поток базового класса для объекта производного класса - C++
Здравствуйте! Можно ли использовать перегруженный оператор ввода/вывода в поток из базового класса для объекта производного класса, если...

14
zss
Модератор
Эксперт С++
6401 / 5967 / 1944
Регистрация: 18.12.2011
Сообщений: 15,364
Завершенные тесты: 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;
}
2
Игорюня
20 / 16 / 7
Регистрация: 07.12.2013
Сообщений: 244
09.03.2014, 12:40  [ТС] #3
Ещё вопрос:если я создаю конструктор в производном классе,то я обязан вызывать через него базовый класс?
1
zss
Модератор
Эксперт С++
6401 / 5967 / 1944
Регистрация: 18.12.2011
Сообщений: 15,364
Завершенные тесты: 1
09.03.2014, 12:45 #4
Не то, чтобы обязаны,
но Вы можете не знать, что именно делает конструктор базового класса,
так что лучше его вызвать.
1
Игорюня
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;
0
zss
Модератор
Эксперт С++
6401 / 5967 / 1944
Регистрация: 18.12.2011
Сообщений: 15,364
Завершенные тесты: 1
09.03.2014, 14:07 #6
Поменяйте тип доступа к переменной базового класса с private на protected.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
09.03.2014, 15:08 #7
Цитата Сообщение от zss Посмотреть сообщение
Поменяйте тип доступа к переменной базового класса с private на protected.
Она и так protected:
Цитата Сообщение от Игорюня Посмотреть сообщение
protected: int First;
Просто чтобы присваивание типа:
Цитата Сообщение от Игорюня Посмотреть сообщение
object.First=10;
работало, оно должно вызываться из функции члена second.
1
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
09.03.2014, 15:39 #8
Цитата Сообщение от Игорюня Посмотреть сообщение
если я создаю конструктор в производном классе,то я обязан вызывать через него базовый класс?
Цитата Сообщение от zss Посмотреть сообщение
Не то, чтобы обязаны,
но Вы можете не знать, что именно делает конструктор базового класса,
так что лучше его вызвать.
чего-чего? если конструктор базового класса принимает параметры, то да обязан
1
zss
Модератор
Эксперт С++
6401 / 5967 / 1944
Регистрация: 18.12.2011
Сообщений: 15,364
Завершенные тесты: 1
09.03.2014, 16:44 #9
Цитата Сообщение от Jupiter Посмотреть сообщение
если конструктор базового класса принимает параметры, то да обязан
Если известно, что с этими параметрами делать, то весь код можно написать в конструкторе производного
класса (разве, что не получится инициализировать private данные базового класса).
Но, еще раз повторяю, лучше вызвать конструктор базового класса,
1
Игорюня
20 / 16 / 7
Регистрация: 07.12.2013
Сообщений: 244
10.03.2014, 06:01  [ТС] #10
Tulosba, то есть,чтобы изменить protected член базового класса через объект производного,нужно сделать это через метод производного?Я не понял.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 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
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2014, 08:46 #12
Цитата Сообщение от Игорюня Посмотреть сообщение
Цитирую:Если элемент является защищенным, объекты производного класса могут обращаться к нему, как будто он является общим.
Откуда цитата? Может не объекты производного класса, а элементы производного класса (т.е., в методах производного класса)? При открытом наследовании защищенные элементы базового класса становятся защищёнными элементами производного, а значит доступ к ним, из внешнего мира, только через методы класса.

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

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

Добавлено через 3 минуты
Уже разобрался.
0
alsav22
5421 / 4816 / 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), к приватным элементам базового - только через методы базового класса.
1
zss
Модератор
Эксперт С++
6401 / 5967 / 1944
Регистрация: 18.12.2011
Сообщений: 15,364
Завершенные тесты: 1
10.03.2014, 11:53 #15
Цитата Сообщение от Игорюня Посмотреть сообщение
то есть,чтобы изменить protected член базового класса через объект производного,нужно сделать это через метод производного?
Не нужно, а можно (право имеете)!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2014, 11:53
Привет! Вот еще темы с ответами:

как сделать чтобы объект производного класса сам себя добавлял в список или массив указателей базового класса? - C++
я хотел так, но программа просто падает void Student::add(Base** head) { cout &lt;&lt; &quot;I here&quot; &lt;&lt; endl; this-&gt;setName(); //все...

Отрабатывает оператор базового, а не производного класса - C++
Здравствуйте! Собственно, вопрос в следующем. Я перегрузил оператор потокового вывода для базового и для производного класса. При выводе...

Вызов методов производного класса из базового - C++
Возможно ли, чтобы class A { void f1() { f2();//если вызвано из B, то вызывается B::f2(), а не A::f2() } void f2(){} }

Объекты производного класса не наследуют методы базового - C++
Доброго всем дня! Вот такая у меня проблема возникла - объекты производного класса свободно вычитаются, но почему-то не складываются,...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
10.03.2014, 11:53
Ответ Создать тему
Опции темы

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