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

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

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

C++ Как вызвать виртуальную функцию из дочернего класса, если она определена и вызывается в конструкторе РОДИТЕЛЬСКОГО класса?
внук родительского класса не может работать с полями дедовского класса; почему? C++
C++ Вызов функции родительского класса в наследнике
C++ Как вызвать метод родительского класса;
Как вызвать функцию родительского класса? C++
Какие методы родительского класса не наследуются? C++
C++ Какие методы класса fstream отвечают за определение количества строк в файле и длины строки?
Может ли метод родительского класса обратиться к полю дочернего класса C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Archi0
28 / 14 / 4
Регистрация: 18.07.2013
Сообщений: 164
04.05.2014, 17:25     Какие методы родительского класса не наследуются? #2
Если у наследованного класса есть конструктор с параметрами и нет конструктора по умолчанию, то компилятор не напишет его за вас. Но это не значит, что конструктор по умолчанию для базового класса исчез. Его по прежнему можно применять явно написав в списке инициализаций или неявно, потому что он все равно будет вызван, если список инициализаций пуст. Если не написать конструктор копии компилятор додумает по своему усмотрению (копирование поле в поле это не тоже самое, что побитовое -- для полей классов будут вызваны конструкторы копий), опять же у вас будет два разных конструктора копии. Если передать в функцию принимающую базовый класс по значению, то будет вызван конструктор копии из базового. Если передать в функцию принимающую по значению наследованный класс, то конструктор копии из наследованного.

Добавлено через 35 минут
То же относится к конструктору с параметрами, в унаследованном можно применять в списке инициализаций. Оператор присваивания перегруженный будет додуман компилятором для вариантов базовый=наследованный наследованный=наследованный. Если добавить отладочную печать в оператор присваивания и в конструктор копии базового класса можно понять, что в данном случае не используется конструктор копии базового класса и используется перегруженный оператор присваивания.

Добавлено через 9 минут
Деструктор у базового и у наследованного свои, можно лишь добавить, что для базового нужно его сделать виртуальным, если через указатель типа базового класса нужно вызвать правильную цепочку деструкторов от наследованного к базовому. К виртуальным методам можно сказать, что нужно использовать указатель иначе передав в функцию по значению базового класса будут вызываться статически методы из базового класса.

Добавлено через 31 минуту
Кликните здесь для просмотра всего текста

main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include "Base.h"
#include "Derived.h"
 
void main()
{
    Derived B(1);
    std::cout<<B.a<<"\n";
    Derived C(B); //copy
    std::cout<<C.a<<"\t"<<C.b<<"\n";
    Derived D(6);
    D= C; //op=
    std::cout<<D.a<<"\t"<<D.b<<"\n";
    Base E(3);
    E = D; // op=
    std::cout<<E.a<<"\n";
    Base F = E; //copy
    std::cout<<E.a<<"\n";
    //int (**p)()  = new (int (*[10])());
}
Base.h
C++
1
2
3
4
5
6
7
8
9
10
11
#pragma once
class Base
{
public:
    Base(void);
    ~Base(void);
    Base(int);
    Base(Base& b);
    Base& operator= (Base&);
    int a;
};
Base.cpp
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
26
27
28
29
#include <iostream>
#include "Base.h"
 
Base::Base(void)
{
    a=7;
}
 
Base::~Base(void)
{
}
 
Base::Base(int n)
{
    a=n;
}
 
Base::Base(Base& b)
{
    a=4;
    std::cout<< "Use copy Base ";
}
 
Base& Base::operator=(Base& b)
{
    a=9;
    std::cout<<"Use op= ";
    return *this;
}
Derived.h
C++
1
2
3
4
5
6
7
8
9
10
#pragma once
#include "base.h"
class Derived :
    public Base
{
public:
    int b;
    Derived(int);
    ~Derived(void);
};
Derived.cpp
C++
1
2
3
4
5
6
7
8
9
10
#include "Derived.h"
 
Derived::Derived(int n):Base()
{
    b=n;
}
 
Derived::~Derived(void)
{
}
Yandex
Объявления
04.05.2014, 17:25     Какие методы родительского класса не наследуются?
Ответ Создать тему
Опции темы

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