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

Не вызывается конструктор базового класса - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Заполнение массива числами от 1 до 25 без повторений http://www.cyberforum.ru/cpp-beginners/thread157355.html
#include <iostream> #include <ctime> using namespace std; int main() { const int ROW=5; const int COLUMN=5; int MAS; srand(time (NULL)); for (int i = 0; i < ROW; i++)
C++ Адресная арифметика Народ!!! Пожайлуста просвятите! Мне важно понять принцип хранения переменных различных типов данных в языках С++ и С#(например как в ячейках памяти будет храниться float a = 1234,33333)/ Зарание... http://www.cyberforum.ru/cpp-beginners/thread157322.html
Изменение указателя - аргумента функции C++
Привет всем! Может я совсем тупой, но не могу понять почему не работает такой пример: #include <iostream> void func (char * ptr) { ptr = new char ; ptr = '1';
STL std::set, std::pair, std::make_pair C++
Я не знаю как описать тему в двух словах, поэтому не обращайте внимание на название темы. Собственно перейдем к нашим баранам: есть пользовательский класс (условно дерево): class tree { double...
C++ Как написать макрос - модуль числа... http://www.cyberforum.ru/cpp-beginners/thread157244.html
Помогите написать макрос на с++, возвращающий модуль числа... Добавлено через 4 минуты Нашёл..
C++ Изменение значения статической переменной не дает =\ static char text; text = ""; error: expression must be a modifiable lvalue это же не конст, а просто статик, в pawn"е часто пользовался static и ок всё было подробнее

Показать сообщение отдельно
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.07.2012, 05:38
Почитал, посмотрел что компилятор пишет и выскажу своё мнение. Мне кажется, что вот это:
C++
1
String(s);
и вот это:
C++
1
String s;
есть одно и тоже (скобки здесь не играют никакой роли): создание локольного объекта класса String конструктором по умолчанию.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Pstring::Pstring(char *s)
{
    if(strlen(s) > SZ - 1)
    {
        for(int j = 0; j < SZ; j++)
        str[j] = s[j];
        str[SZ-1] = '\0';
    }
    else
    {
       String (s); // создание локального объекта s конструктором по умолчанию.
    } 
}
При этом в str записывается пустая строка.
И когда ТС пишет, в конструкторе производного класса:
C++
1
 String (s);
, то это всё равно, что написать
C++
1
String s;
Поэтому s в String (s); не имеет никакого отношения к s, в парметрах конструктора Pstring. Для ясности можно так написать:
C++
1
2
String(s);
s.display();
Невозможно в теле конструктора производного класса создать объект базового класса, который будет являтся частью объекта производного класса. Создаётся временный объект, который перестаёт существовать после выхода из конструктора производного класса. Возможно только ДО вхождения в тело конструктора (через список инициализаторов). Поэтому, в данном примере создаётся, конструктором по умолчанию, просто временный объект s базового класса, который не является частью никакого объекта производного класса. А через g.display(); выводится поле str объекта базового класса, который создан, конструктором по умолчанию, при создании объекта g производного класса и является его частью. Если так написано:
C++
1
String(s).display();
, то будет создан временный, неименованный объект базового класса (уже не конструктором по умолчанию), поле str которого будет проинициализированно значением параметра s и выведено на консоль, после чего этот объект станет недоступен (исчезнет).

Добавлено через 8 минут
Цитата Сообщение от LineStown Посмотреть сообщение
CyBOSSeR, Спасибо, я понял, что только список инициализации вызовет конструктор.
Тему можно закрывать
Не только. Если нужно явно, то через список. Если в списке не задан, то будет вызываться неявно конструктор по умолчанию при создании каждого объекта производного класса.

Добавлено через 39 минут
Цитата Сообщение от alex_x_x Посмотреть сообщение
B() {
a = 100500; // Если бы конструктор можно было бы вызывать из произвольного места
A(); // то мы могли бы иметь доступ к полям предка до его инициализации
Можно вызывать из произвольного места, но созданный объкет-предок, не будет иметь никакого отношения к тому объекту-наследнику из которого был вызван конструктор. А наследники имеют доступ к полям только тех предков, которые являются их частью.
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru