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

Какие методы родительского класса не наследуются? - C++

Восстановить пароль Регистрация
 
lev_
2 / 2 / 0
Регистрация: 26.05.2014
Сообщений: 119
29.05.2014, 08:24     Какие методы родительского класса не наследуются? #1
1. конструктор копирования
2. конструктор по умолчанию
3. перегруженная операция присваивания
4. деструктор
5. конструктор с параметрами
6. виртуальные
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2014, 08:24     Какие методы родительского класса не наследуются?
Посмотрите здесь:

C++ Как вызвать виртуальную функцию из дочернего класса, если она определена и вызывается в конструкторе РОДИТЕЛЬСКОГО класса?
внук родительского класса не может работать с полями дедовского класса; почему? C++
C++ Вызов функции родительского класса в наследнике
C++ Как вызвать метод родительского класса;
Как вызвать функцию родительского класса? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kventin_zhuk
БНТУ ФИТР
 Аватар для kventin_zhuk
214 / 154 / 15
Регистрация: 26.12.2012
Сообщений: 382
29.05.2014, 10:00     Какие методы родительского класса не наследуются? #2
lev_, конструкторы не наследуются.
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
29.05.2014, 11:00     Какие методы родительского класса не наследуются? #3
И деструктор, стало быть, тоже.
lev_
2 / 2 / 0
Регистрация: 26.05.2014
Сообщений: 119
29.05.2014, 11:31  [ТС]     Какие методы родительского класса не наследуются? #4
спасибо
Denis123456789
43 / 43 / 17
Регистрация: 02.06.2013
Сообщений: 180
29.05.2014, 12:17     Какие методы родительского класса не наследуются? #5
Ничего из приведенного не наследуется, кроме виртуальных функций, виртуальность на наследование методов в плане наследования или не наследования того или иного метода базового класса производным влияния не оказывает. Правда в c++ 11 вроде уже можно наследовать конструкторы
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
29.05.2014, 18:23     Какие методы родительского класса не наследуются? #6
Denis123456789, а перегруженный operator= разве не наследуется?
Denis123456789
43 / 43 / 17
Регистрация: 02.06.2013
Сообщений: 180
29.05.2014, 20:52     Какие методы родительского класса не наследуются? #7
BumerangSP, нет не наследуется, потому что обычно оператор присваивания имеет в качестве параметра константную ссылку на объект того же класса, в котором этот оператор перегружается, поэтому сигнатура даже в родственных классах будет разнится. Например следующий код не компилируется (хотя здесь оператор присваивания принимает параметр отличный от объекта того же класса)
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 a
{
    int d;
public:
    int pr(){return вd;}
 void operator=(int r)
    {
    d=r;
    
}};
class b: public a
{
};
int main()
{
b f;
f=5;
  cout<<f.pr();
    return 0;  
    }
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
29.05.2014, 21:23     Какие методы родительского класса не наследуются? #8
Denis123456789, я как бы сам всегда утверждал, что, мол, не наследуется, т.к. его действия сходны с конструированием объекта.
Но вот данный код что подразумевает? Может, я позабыл чего?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
struct A
{
    const A& operator=(const A& a) { cout << "A::op=\n"; return *this; }
};
 
struct B:  public A
{
};
 
int main()
{
   B b;
   b = B();
}
Denis123456789
43 / 43 / 17
Регистрация: 02.06.2013
Сообщений: 180
29.05.2014, 21:34     Какие методы родительского класса не наследуются? #9
BumerangSP, компилятор снабжает класс оператором присваивания по умолчанию, при отсутствии определения в классе оператора присваивания (также как конструктором и деструктором по умолчанию при отсутствия их определения) . Оператор присваивания по умолчанию присваивает членам объекта слева , значения соответствующих членов объекта справа. Если члены класса не являются указателями на области динамической памяти, то оператора присваивания по умолчанию достаточно.
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
29.05.2014, 21:45     Какие методы родительского класса не наследуются? #10
BumerangSP, А здесь же вроде встроенный оператор вызывается, не?

Добавлено через 11 минут
Denis123456789, operator= все-таки наследуется, но в вашем примере встроенный b::operator=(const b&) перекрывает базовый a::operator=(int), поэтому этот пример не компилируется. Можно сделать так
C++
1
2
3
4
5
struct B:  public A
{
    public:
    using a::operator=;
};
, и тогда кандидатами станут оба оператора и выберется тот, который принимает int
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
29.05.2014, 21:46     Какие методы родительского класса не наследуются? #11
Denis123456789, ничего не понял, конкретней можно?) Эти общие сведения я из книжек помню. Но сейчас для конкретного примера специального туда не полез.

ViktorKozlov, ну, я присваиваю объекту класса B объект того же класса. Надпись выходит "A::op=". Определю свой operator= в классе B - будет выведено то, что напишу в его теле.
Почему?

UPD: Вот, кажется, все.
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
29.05.2014, 21:57     Какие методы родительского класса не наследуются? #12
BumerangSP, встроенные операторы присваивания, конструкторы по умолчанию и копирования обладают таким свойством, что вызывают соответствующие функции базового класса. В вашем случае, встроенный operator= вызывает operator= базового класса, который определен. Если же в производном классе определить свой operator=, то он не будет по умолчанию вызывать базовую версию (но можно это сделать явно)
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
29.05.2014, 22:09     Какие методы родительского класса не наследуются? #13
ViktorKozlov, да с конструкторами-то все ясно. Что-то я всегда обделял вниманием operator=...Хотя логично, по сути. Копирование ведь происходит прямым копированием данных соотв. переменных. Притом для каждого подобъекта копируются свои.
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
29.05.2014, 22:24     Какие методы родительского класса не наследуются? #14
BumerangSP, да так и есть. Иначе кому нужен такой встроенный оператор, если он будет напрямую все копировать? Если некоторые поля или базовый класс имеют определенный оператор=, то почему бы им не воспользоваться? В принципе, вполне логично
makemelaugh
5 / 5 / 2
Регистрация: 12.12.2013
Сообщений: 20
Завершенные тесты: 1
20.10.2016, 23:03     Какие методы родительского класса не наследуются? #15
Не наследуются:
Конструкторы и деструкторы, Перегруженные операторы, Дружественные(friend) функции
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2913 / 1449 / 398
Регистрация: 18.10.2014
Сообщений: 2,676
21.10.2016, 00:23     Какие методы родительского класса не наследуются? #16
Цитата Сообщение от makemelaugh Посмотреть сообщение
Не наследуются:
Конструкторы и деструкторы, Перегруженные операторы, Дружественные(friend) функции
Ответ не верный.

- Все перегруженные операторы наследуются (С чего бы это вдруг им не наследоваться?)

- Упоминание friend-функций тут совсем не в кассу. О чем речь вообще?

- Деструкторы действительно не наследуются.

- С конструкторами ситуация сложнее. Сами по себе они не наследуются, но начиная С++14 конструкторы (с рядом исключений) можно наследовать явно, путем применения using-декларации.
Croessmah
21.10.2016, 00:25
  #17

Не по теме:

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
путем применения using-декларации.
Щас налетят коршуны с высказываниями вида, - "Враньё, это не наследование, оно работает не так. А-а-а-а-а!"
Мы уже это проходили.

TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2913 / 1449 / 398
Регистрация: 18.10.2014
Сообщений: 2,676
21.10.2016, 00:34     Какие методы родительского класса не наследуются? #18

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
Щас налетят коршуны с высказываниями вида, - "Враньё, это не наследование, оно работает не так. А-а-а-а-а!"
Мы уже это проходили.
Останется только, как фиговым листком, прикрываться страничкой из стандарта С++11, где соответствующий раздел так и называется: 12.9 Inheriting constructors [class.inhctor] - "Наследование конструкторов".



Цитата Сообщение от TheCalligrapher Посмотреть сообщение
- С конструкторами ситуация сложнее. Сами по себе они не наследуются, но начиная С++14 конструкторы (с рядом исключений) можно наследовать явно, путем применения using-декларации.
Поправка: начиная с С++11.
Croessmah
21.10.2016, 00:41
  #19

Не по теме:

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
так и называется:
и получим снова это:
Цитата Сообщение от Автор
Ну, это, скорее, игра слов, так как "наследование" конструкторов - это не наследование в обычном смысле.
Но даже в этом "наследовании" не "наследуются" конструкторы по умолчанию, копирования и перемещения.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2016, 00:50     Какие методы родительского класса не наследуются?
Еще ссылки по теме:

Какие методы родительского класса не наследуются? C++
C++ Какие методы класса fstream отвечают за определение количества строк в файле и длины строки?
Может ли метод родительского класса обратиться к полю дочернего класса C++

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

Или воспользуйтесь поиском по форуму:
TheCalligrapher
21.10.2016, 00:50     Какие методы родительского класса не наследуются?
  #20

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
и получим снова это:
Ну, понятное дело, что общий термин "наследование" четкого определения не имеет и схоластических споров на эту тему можно устроить бесчисленное множество. Из той же оперы: "наследуются" ли обычные функции-члены, которые оказались скрытыми в классе-наследнике?

Yandex
Объявления
21.10.2016, 00:50     Какие методы родительского класса не наследуются?
Ответ Создать тему
Опции темы

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