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

Не вызывается конструктор базового класса - 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';
C++ Как написать макрос - модуль числа...
Помогите написать макрос на с++, возвращающий модуль числа... Добавлено через 4 минуты Нашёл..
C++ Изменение значения статической переменной http://www.cyberforum.ru/cpp-beginners/thread157228.html
не дает =\ static char text; text = ""; error: expression must be a modifiable lvalue это же не конст, а просто статик, в pawn"е часто пользовался static и ок всё было
C++ Часы в псевдографике доброго времени суток. задание заключается в написании программы, отображающую на экране текущее время в виде циферблата с секундной,минутной и часовой стрелками(разных цветов). и сохранять картинку в файле по желанию пользователя. заранее благодарен. подробнее

Показать сообщение отдельно
alsav22
5282 / 4801 / 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(); // то мы могли бы иметь доступ к полям предка до его инициализации
Можно вызывать из произвольного места, но созданный объкет-предок, не будет иметь никакого отношения к тому объекту-наследнику из которого был вызван конструктор. А наследники имеют доступ к полям только тех предков, которые являются их частью.
 
Текущее время: 08:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru