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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Компилятор не видит #include <vcl.h> http://www.cyberforum.ru/cpp-beginners/thread1165965.html
#include <iostream> #include <locale.h> #include <vcl.h> #pragma hdrstop using namespace std; //--------------------------------------------------------------------------- #pragma argsused
C++ Копировать содержимое одного файла во второй до тех пор, пока не встретится число меньшее, чем заданное подскажите как можно скопировать содержимое одного файла во второй, при этом остановится если среди чисел будет меньшее от заданного в этом куске я заполняю первый файл (содержимое которого нужно... http://www.cyberforum.ru/cpp-beginners/thread1165955.html
C++ Построение дерева разбора предложений, пирамидальная сортировка данных различного типа
Подскажите, как это сделать "Построение дерева разбора предложений, пирамидальное сортировка на данные различного типа".
Транспонирование матрицы C++
пока сделал лишь определитель,следующий шаг транспонирование,где я и застрял.помогите реализовать #include <stdio.h> #include <conio.h> #include <iostream.h> float det(float **p, int n) { ...
C++ Создание нового типа MPI http://www.cyberforum.ru/cpp-beginners/thread1165906.html
Задача следующая: в каждом процессе дано три числа(одно вещественное, два целых), используя произвольный тип, переслать числа из подчиненных в главный и в главном вывести. Делаю так: int flag;...
C++ Раздельный native unit test для проекта скомпилированного как Debug и как Release Используя условную компиляцию версия Debug и Release может существенно различаться. Не все ситуации можно смоделировать для теста и могут пригодиться какие-то дополнительные функции в классе, которые... подробнее

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

Добавлено через 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)
{
}
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.