Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
0 / 0 / 0
Регистрация: 28.04.2022
Сообщений: 12

Вызов конструктора базового класса

20.12.2025, 04:05. Показов 1195. Ответов 22

Студворк — интернет-сервис помощи студентам
Добрый день!

Вопрос по упражнению 2 из главы 9 "Наследование" книги, указанной в теме
Суть упражнения: нужно создать порожденный класс Pstring от базового "самопального" класса String.
класс String превращает строки типа char в объекты этого класса
класс Pstring позволять ограничивать длину строки, если она превышает размер строки установленный в базовом классе String

Подскажите пожалуйста, почему компилятор не хочет выполнять конструктор с одним аргументом в базовом классе, запускаемый из порожденного класса в фрагменте кода в строке 31 "...else String(s);..."
Компилирую код в Visual Studio 2019
Заранее спасибо!

код программы по упражнению 2
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <cstring> // для strcpy_s(), etc.
#include <Windows.h> // для SetConsoleCP(1251); SetConsoleOutputCP(1251);
using namespace std;
///////////////////////////////////////////////////////////
class String // базовый класс
{
protected: 
 
    static const int SZ = 30; // размер всех объектов String
    char str[SZ]; // содержит С-строку
public:
    String() : str{0} {} //конструктор без аргументов
    String(char s[]) {strcpy_s(str, s);} // конструктор 1, один аргумент
    
    void display() {cout << str<<endl;} // вывести String
        
};
///////////////////////////////////////////////////////////
class Pstring :public String // порожденный класс
{
public:
    Pstring(char s[])
    {
        if (strlen(s) > SZ - 1) // если слишком длинная строка, то копировать SZ-1 символ
        {
            int j;
            for (j = 0; j < SZ - 1; j++) { str[j] = s[j];}// копировать символы «вручную»
            str[j] = '\0'; // добавить окончание строки
        }
        else String(s); // иначе создать нормальную строку  
        
            
         
    }
};
//---------------------------------------------------------
 
 
///////////////////////////////////////////////////////////
int main()
{   ///////////////
    //Русский язык
    SetConsoleCP(1251); SetConsoleOutputCP(1251);
    //////////////////////////////////////
    char sch1[] = "Это очень-очень длинная строка, которая, возможно, да, нет, точно, -- превысит размер, ограниченный SZ.";
    char sch2[] = "А это коротенькая строка.";
    Pstring s1(sch1);
    cout << "s1 ="; s1.display(); // вывести s1
    Pstring s2(sch2);
    cout << "s2 ="; s2.display(); // вывести s2
    cout << endl;
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.12.2025, 04:05
Ответы с готовыми решениями:

Вызов конструктора базового класса из класса-наследника
Можно ли вне списка инициализации вызвать конструктор базового класса ? class A { int a;...

Вызов конструктора базового класса
Здравствуйте! Я вот начал изучать C# и немножечко освежил ООП. Но вот у меня вопрос. Я точно помню,...

Знакомство с наследованием. Вызов конструктора базового класса
В инете немного почиатл про наследование и решил сразу перейти к практике Есть два класа point и...

22
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,986
20.12.2025, 06:57
Цитата Сообщение от allar8 Посмотреть сообщение
else String(s);
так не получится, это создание безымянного временного объекта.

можно переделать, например, так (функция MakeFrom)

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#include <cstring>
 
class String
{
protected: 
 
    static const size_t SZ = 30; // размер всех объектов String
    char str[SZ]=""; // содержит С-строку
public:
    String()
    {
    }
    
    void MakeFrom(const char* s)
    {
        std::strcpy(str, s);
    }
    
    String(const char* s)
    {
        MakeFrom(s);
    }
    
    void display()const
    {
        std::cout << str<<'\n';
    }
};
 
class Pstring :public String
{
public:
    Pstring(const char* s)
    {
        if (std::strlen(s) > SZ - 1) // если слишком длинная строка, то копировать SZ-1 символ
        {
            int j;
            for (j = 0; j < SZ - 1; j++)
            {
                str[j] = s[j];
            }
            
            str[j] = '\0'; // добавить окончание строки
        }
        else
        {
            MakeFrom(s);
        }
    }
};
 
int main()
{
    char sch1[] = "Это очень-очень длинная строка, которая, возможно, да, нет, точно, -- превысит размер, ограниченный SZ.";
    char sch2[] = "А это коротенькая строка.";
    
    Pstring s1(sch1);
    std::cout << "s1 =";
    s1.display(); // вывести s1
    
    Pstring s2(sch2);
    
    std::cout << "s2 =";
    s2.display(); // вывести s2
}
https://onlinegdb.com/rlyiMsce1

Добавлено через 51 секунду
но без проверки длины - опасно так делать всё равно
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12923 / 6792 / 1818
Регистрация: 18.10.2014
Сообщений: 17,187
20.12.2025, 09:14
Цитата Сообщение от allar8 Посмотреть сообщение
Подскажите пожалуйста, почему компилятор не хочет выполнять конструктор с одним аргументом в базовом классе
Что значит "не хочет выполнять"??? Он прекрасно выполняется. В строке 31 создается временный объект и инициализируется при помощи именно этого конструктора.
0
0 / 0 / 0
Регистрация: 28.04.2022
Сообщений: 12
20.12.2025, 09:44  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
так не получится, это создание безымянного временного объекта.
Спасибо за отклик!
Согласен Ваше решение имеет право на жизнь. Но вот это именно и непонятно почему решение с безымянным объектом не работает - оно выглядит более элегантно (использует конструктор в базовом классе), и при условии, что у нас класс String такой какой есть и его "условно изменять нельзя".
Да есть и другое решение, например 33 строку в моем коде см. ниже с безымянным объектом можно заменить просто на повторение аналогичного кода в конструкторе c одним аргументом класса String "... strcpy_s(str, s);..."
Но данное решение, требует копировать код, а нужно повторно использовать код заложенный в конструкторе c одним аргументом класса String.

Собственно вопрос не в том как сделать программу работоспособной, а хочется понять почему Visual Studio 2019 не позволяет в моем случае использовать безымянный объект. Может с 2004 года это было умышленно изменено в стандарте C++? Хочется это понять. И вообще как по мне странно, что в данной ситуации нельзя использовать безымянный объект и конструктор с одним аргументом в базовом классе. Такое ощущение, что в Visual Studio 2019 это специально запретили, но зачем, вот и хочу понять.

Code
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <cstring> // для strcpy_s(), etc.
#include <Windows.h> // для SetConsoleCP(1251); SetConsoleOutputCP(1251);
using namespace std;
///////////////////////////////////////////////////////////
class String // базовый класс
{
protected: 
 
    static const int SZ = 30; // размер всех объектов String
    char str[SZ]; // содержит С-строку
public:
    String() : str{0} {} //конструктор без аргументов
    String(char s[]) {strcpy_s(str, s);} // конструктор 1, один аргумент
    
    void display() {cout << str<<endl;} // вывести String
        
};
///////////////////////////////////////////////////////////
class Pstring :public String // порожденный класс
{
public:
    Pstring(char s[])
    {
        if (strlen(s) > SZ - 1) // если слишком длинная строка, то копировать SZ-1 символ
        {
            int j;
            for (j = 0; j < SZ - 1; j++) { str[j] = s[j];}// копировать символы «вручную»
            str[j] = '\0'; // добавить окончание строки
        }
        else // иначе создать нормальную строку  
        {
            /*String(s);*/ strcpy_s(str, s);
        } 
    }
};
//---------------------------------------------------------
 
 
///////////////////////////////////////////////////////////
int main()
{   ///////////////
    //Русский язык
    SetConsoleCP(1251); SetConsoleOutputCP(1251);
    //////////////////////////////////////
    char sch1[] = "Это очень-очень длинная строка, которая, возможно, да, нет, точно, -- превысит размер, ограниченный SZ.";
    char sch2[] = "А это коротенькая строка.";
    Pstring s1(sch1);
    cout << "s1 ="; s1.display(); // вывести s1
    Pstring s2(sch2);
    cout << "s2 ="; s2.display(); // вывести s2
    cout << endl;
    return 0;
}
Добавлено через 1 минуту
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что значит "не хочет выполнять"??? Он прекрасно выполняется. В строке 31 создается временный объект и инициализируется при помощи именно этого конструктора.
Да да должен, но у меня почему то не работает
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12923 / 6792 / 1818
Регистрация: 18.10.2014
Сообщений: 17,187
20.12.2025, 10:28
Цитата Сообщение от allar8 Посмотреть сообщение
, а хочется понять почему Visual Studio 2019 не позволяет в моем случае использовать безымянный объект.
Что значит "не позволяет"? Все она позволяет. Это вы этот безымянный объект никак не используете. Вы написали код, в котором безымянный временный объект создается и тут же мгновенно бесследно уничтожается, ничего не успев сделать за свою короткую жизнь.

Цитата Сообщение от allar8 Посмотреть сообщение
Да да должен, но у меня почему то не работает
Все работает именно так, как вы написали в коде.
0
0 / 0 / 0
Регистрация: 28.04.2022
Сообщений: 12
20.12.2025, 12:04  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что значит "не позволяет"? Все она позволяет. Это вы этот безымянный объект никак не используете. Вы написали код, в котором безымянный временный объект создается и тут же мгновенно бесследно уничтожается, ничего не успев сделать за свою короткую жизнь.
Спасибо, но тогда значит что-то не так в моем коде в отношении этого безымянного объекта? Подскажите пожалуйста, что значит я не даю этому безымянному ничего сделать? Я так понимаю, чего то у меня не хватает? Или я что-то делаю не так? Р. Лафоре об этом ничего не пишет в своей книге. Собственного говоря поэтому и вынужден был обратиться за помощью к специалистам с форума. Сам я только учусь.
Заранее спасибо!
0
 Аватар для vlisp
1061 / 982 / 153
Регистрация: 10.08.2015
Сообщений: 5,327
20.12.2025, 13:19
ткни пальцем где у тебя безымянный объект
0
0 / 0 / 0
Регистрация: 28.04.2022
Сообщений: 12
20.12.2025, 13:37  [ТС]
Цитата Сообщение от vlisp Посмотреть сообщение
ткни пальцем где у тебя безымянный объект
В первом моем сообщении:
Цитата Сообщение от allar8 Посмотреть сообщение
31 else String(s); // иначе создать нормальную строку
Как я понимаю эта строка в базовом классе String должна вызвать конструктор с одним аргументом:
Цитата Сообщение от allar8 Посмотреть сообщение
14 String(char s[]) {strcpy_s(str, s);} // конструктор 1, один аргумент
но вызывается почему-то конструктор без аргументов:
Цитата Сообщение от allar8 Посмотреть сообщение
13 String() : str{0} {} //конструктор без аргументов
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
20.12.2025, 15:11
Цитата Сообщение от allar8 Посмотреть сообщение
Как я понимаю эта строка в базовом классе
Неправильно понимаете.

У вас пока нет понимания, зачем вообще нужны классы, и как с ними работать.

По-хорошему, логика инициализации объектов классов содержится в конструкторах этих классов, а не где-то ещё.
Собственно, классы для того и существуют, что бы инкапсулировать некоторую логику внутри себя.

Воспринимайте классы, как своего рода инструменты, которые умеют делать для вас некоторую полезную работу.

Дрелька лучше всех знает, как ей правильно сверлить.
Телефон лучше всех знает, как ему правильно звонить.
Класс String лучше всех знает, как ему инициализировать собственные данные, и манипулировать ими.

А вы, в своем классе Pstring попытались через голову String манипулировать его данными.
Это - логическая ошибка.

Следующий код похож на ваш, но теперь логика инициализации String содержится в самом String, в соответствии с логикой здравого смысла:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <cstring> // для strcpy_s(), etc.
#include <Windows.h> // для SetConsoleCP(1251); SetConsoleOutputCP(1251);
using namespace std;
///////////////////////////////////////////////////////////
class String // базовый класс
{
protected: 
 
    static const int SZ = 30; // размер всех объектов String
    char str[SZ]; // содержит С-строку
public:
    String() : str{0} {} //конструктор без аргументов
    String(char s[]) 
    {
        if (strlen(s) > SZ - 1) // если слишком длинная строка, то копировать SZ-1 символ
        {
            int j;
            for (j = 0; j < SZ - 1; j++) { str[j] = s[j];}// копировать символы «вручную»
            str[j] = '\0'; // добавить окончание строки
        }
        else // иначе создать нормальную строку  
        {
            strcpy_s(str, s);
        } 
        
    } // конструктор 1, один аргумент
    
    void display() {cout << str<<endl;} // вывести String
        
};
///////////////////////////////////////////////////////////
class Pstring :public String // порожденный класс
{
public:
    Pstring(char s[])
        : String(s)
    {}
};
//---------------------------------------------------------
 
 
///////////////////////////////////////////////////////////
int main()
{   ///////////////
    //Русский язык
    SetConsoleCP(1251); SetConsoleOutputCP(1251);
    //////////////////////////////////////
    char sch1[] = "Это очень-очень длинная строка, которая, возможно, да, нет, точно, -- превысит размер, ограниченный SZ.";
    char sch2[] = "А это коротенькая строка.";
    Pstring s1(sch1);
    cout << "s1 ="; s1.display(); // вывести s1
    Pstring s2(sch2);
    cout << "s2 ="; s2.display(); // вывести s2
    cout << endl;
    return 0;
}
Обратите внимание: класс Pstring оказался пустышкой.
В данном случае получается, что Pstring не нужен.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12923 / 6792 / 1818
Регистрация: 18.10.2014
Сообщений: 17,187
20.12.2025, 17:05
Цитата Сообщение от allar8 Посмотреть сообщение
Спасибо, но тогда значит что-то не так в моем коде в отношении этого безымянного объекта?
Для того, чтобы говорить о том, что "не так", вы сначала должны объяснить, что именно вы хотели сделать и что вас не устраивает в результате.

Я уже написал вам выше, что в рассматриваемой строчке молча создается и мгновенно уничтожается безымянный временный объект. Именно это вы написали в своём коде. Именно это и происходит. То есть все "так". О каком "не так" вы ведете речь? Чем вам не нравится то, что происходит в коде?
0
0 / 0 / 0
Регистрация: 28.04.2022
Сообщений: 12
20.12.2025, 17:31  [ТС]
Цитата Сообщение от eva2326 Посмотреть сообщение
ледующий код похож на ваш
Спасибо за обратную связь!
Но тот код что вы предложили подразумевает корректировку класса String
У меня задача и в упражнении 2 - не трогая код класса String добиться ограничения длинны строки за счет порожденного класса Pstring, т.е. понять и отработать одну из возможностей наследования - улучшить возможности грубо говоря класса String в данном случае.
Я пока все таки не понимаю, почему фрагмент
Цитата Сообщение от allar8 Посмотреть сообщение
else String(s); // иначе создать нормальную строку
не вызывает конструктор с одним аргументом в базовом классе String.
Или почему так делать нельзя, хотя у Р.Лафоре именно так так и приведен код. Там конечно есть и другие косяки в книге, но с ними мне удается пока справляться и есть понимание, а тут прям хочется разобраться.
Если объясните почему не запускается конструктор с одним аргументом в базовом классе или объясните почему тут это не работает буду Вам очень благодарен! Может нужно просто в дугой версии Visual Studio попробовать или вообще взять компилятор Вorland? Если есть у кого-нибудь возможность пошаговово пропустить мой код например в Visual Studio 2025, если такой есть буду благодарен!
Заранее спасибо!

Добавлено через 11 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
в рассматриваемой строчке молча создается и мгновенно уничтожается безымянный временный объект
Странно почему в конструкторе порожденного класса после двоеточия в списке инициализации это работает:
Цитата Сообщение от eva2326 Посмотреть сообщение
Pstring(char s[])
        : String(s)
    {}
А а теле конструктора нет, хотя в примере у Р.Лафоре именно так.

В общем ладно понял в теле конструктора не работают видимо безымянные объекты. Ладно всем спасибо буду знать

Или вроде начал понимать - в списке инициализации String(s) и в теле конструктора String(s) это не одно и тоже:
в списке инициализации String(s) - как раз вызов конструктора в базовом классе с одним аргументом
а в теле конструктора String(s) - это да просто безымянный объект причем совершенно другой никак не связанный с моими объектами Pstring s1 и Pstring s2
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12923 / 6792 / 1818
Регистрация: 18.10.2014
Сообщений: 17,187
20.12.2025, 17:57
Цитата Сообщение от allar8 Посмотреть сообщение
Странно почему в конструкторе порожденного класса после двоеточия в списке инициализации это работает:
А а теле конструктора нет,
Но это совершенно разные конструкции, как синтаксически, так и семантически. Одна - список инициализации конструктора, другая - обычное выражение. Ничего общего между ними нет. Они делают совершенно разные вещи. Не надо пытаться сравнивать эти конструкции.

В списке инициализации конструктора эта конструкция вызывает инициализацию базового подобъекта вашего объекта. А конструкция в строке 31 никакого отношения к базовому подобъекту уже не имеет.

Цитата Сообщение от allar8 Посмотреть сообщение
Но хотя в примере у Р.Лафоре именно так.
Как именно в примере у Р.Лафоре? Приведите этот пример.

---

Цитата Сообщение от allar8 Посмотреть сообщение
В первом моем сообщении:
Как я понимаю эта строка в базовом классе String должна вызвать конструктор с одним аргументом:
К "базовому классу" строка 31 вообще никакого отношения не имеет.

А в остальном: да, эта строка в итоге вызывает конструктор с одним аргументом. Но она вызывает его для совсем другого объекта - для временного безымянного объекта, который в этом месте создается и тут же уничтожается (бессмысленное действие). К вашему "базовому классу" этот объект не имеет никакого отношения. На ваш конструируемый объект это не оказывает никакого влияния. Что вы и наблюдаете.

Цитата Сообщение от allar8 Посмотреть сообщение
но вызывается почему-то конструктор без аргументов:
Неверно. См. выше.
1
 Аватар для Recrut_rf
379 / 322 / 65
Регистрация: 14.10.2014
Сообщений: 1,373
20.12.2025, 18:19
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Приведите этот пример.
видимо allar8, имеет ввиду вот этот код:
Кликните здесь для просмотра всего текста

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// ex9_2.cpp
//inheritance from String class
#include <iostream>
#include <cstring>                //for strcpy(), etc.
using namespace std;               
////////////////////////////////////////////////////////////////
class String                      //base class
   {
   protected:                     //Note: can't be private
      enum { SZ = 80 };           //size of all String objects
      char str[SZ];               //holds a C-string
   public:
      String()                    //constructor 0, no args
         { str[0] = '\0'; }
      String( char s[] )          //constructor 1, one arg
         { strcpy(str, s); }      //  convert string to String
      void display() const        //display the String
         { cout << str; }
      operator char*()            //conversion function
         { return str; }          //convert String to C-string
   };
////////////////////////////////////////////////////////////////
class Pstring : public String     //derived class 
   {
   public:
      Pstring( char s[] );        //constructor
   };
//--------------------------------------------------------------
Pstring::Pstring( char s[] )      //constructor for Pstring
   {
   if(strlen(s) > SZ-1)           //if too long,
      {
      for(int j=0; j<SZ-1; j++)   //copy the first SZ-1
         str[j] = s[j];           //characters "by hand"
      str[j] = '\0';              //add the null character
      }
   else                           //not too long,
      String(s);                  //so construct normally
   }
////////////////////////////////////////////////////////////////
int main()
   {                                        //define String
   Pstring s1 = "This is a very long string which is probably "
          "no, certainly--going to exceed the limit set by SZ.";
   cout << "\ns1="; s1.display();           //display String
 
   Pstring s2 = "This is a short string.";  //define String
   cout << "\ns2="; s2.display();           //display String
   cout << endl;
   return 0;
   }


Добавлено через 2 минуты
это исходник для книги
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12923 / 6792 / 1818
Регистрация: 18.10.2014
Сообщений: 17,187
20.12.2025, 18:24
Цитата Сообщение от Recrut_rf Посмотреть сообщение
видимо allar8, имеет ввиду вот этот код:
это исходник для книги
Если такое написано в книге, то это просто дико некачественная книга. Не надо ее читать.

У меня уже вылетело из головы, "что мы думаем про Лафоре". Но я "поднял картотеку" и вижу, что там все плохо

Не получается вывести строку через метод класса (выводит пустоту) (та же тема)

Ошибки в книги Р.Лафоре "Объектно-Ориентирование программирование в C++"
Error C4430: отсутствует спецификатор типа - предполагается int - как исправить?
Ошибка: namespace "geoo" has no member "ch"
1
0 / 0 / 0
Регистрация: 28.04.2022
Сообщений: 12
20.12.2025, 18:44  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Если такое написано в книге, то это просто дико некачественная книга. Не надо ее читать.
У меня уже вылетело из головы, "что мы думаем про Лафоре". Но я "поднял картотеку" и вижу, что там все плохо
Большое Спасибо!
Чувствовал, что там что-то не так). Но с другой стороны очень доступно написано. Если б не было ошибок в книге, то книга супер. С такой подачей материала пусть и с ошибками я аналогов не встречал. Даже думал, что ошибки сделаны специально, чтобы тот кто хочет разобраться их бы сам исправлял. С этой вот ошибкой сам не смог справиться, поэтому и обратился сюда. Еще раз Спасибо!
0
 Аватар для Recrut_rf
379 / 322 / 65
Регистрация: 14.10.2014
Сообщений: 1,373
20.12.2025, 18:44
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Если такое написано в книге
Это хуже чем в самой книге - это, как я понял, пример решения упражнения 2 главы 9 из книги. Вот только не помню где эти исходники я отрыл - очень давно это было. Может это не официал, а чьё-то творчество.

TheCalligrapher
Сам я тоже начинал с этой книги, но когда-то давно, то ли вы, то ли ещё кто-то с этого форума мне сообщали, что книга эта мягко говоря так себе.... Вот теперь я понимаю почему....
0
0 / 0 / 0
Регистрация: 28.04.2022
Сообщений: 12
20.12.2025, 18:49  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Но это совершенно разные конструкции, как синтаксически, так и семантически. Одна - список инициализации конструктора, другая - обычное выражение. Ничего общего между ними нет. Они делают совершенно разные вещи. Не надо пытаться сравнивать эти конструкции.
В списке инициализации конструктора эта конструкция вызывает инициализацию базового подобъекта вашего объекта. А конструкция в строке 31 никакого отношения к базовому подобъекту уже не имеет.
Да начал, тоже это понимать - большое спасибо!
0
 Аватар для Recrut_rf
379 / 322 / 65
Регистрация: 14.10.2014
Сообщений: 1,373
20.12.2025, 18:50
Но объяснения самой сути ООП лучше чем в этой книге я тоже нигде более не находил
В общем - если не заморачиваться синтаксисом и прочими конструкциями, а просто постигать саму концепцию - то это, вероятно, будет лучшая книга для новичка.
1
0 / 0 / 0
Регистрация: 28.04.2022
Сообщений: 12
20.12.2025, 18:53  [ТС]
Цитата Сообщение от Recrut_rf Посмотреть сообщение
Но объяснения самой сути ООП лучше чем в этой книге я тоже нигде более не находил
В общем - если не заморачиваться синтаксисом и прочими конструкциями, а просто постигать саму концепцию - то это, вероятно, будет лучшая книга для новичка.
Согласен с Вами на все 100
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12923 / 6792 / 1818
Регистрация: 18.10.2014
Сообщений: 17,187
20.12.2025, 19:04
Цитата Сообщение от Recrut_rf Посмотреть сообщение
Это хуже чем в самой книге - это, как я понял, пример решения упражнения 2 главы 9 из книги. Вот только не помню где эти исходники я отрыл - очень давно это было. Может это не официал, а чьё-то творчество.
В англоязычном PDF 4-го издания книги этот код присутствует в приложении G. Да, это приложение с ответами на вопросы и решениями упражнений.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.12.2025, 19:04
Помогаю со студенческими работами здесь

Вызов конструктора базового класса из порожденного
Есть Базовый класс студент: имеет поля: фамилия, адрес, тел., возраст. Порожденный класс...

Вызов конструктора базового класса
Приветствую всех. Создаю класс-наследник std::string. У базового класса есть конструктор копии:...

Создание базового класса. Наследование от базового класса
видало 2 ошибку 1) Ошибка LNK1120 неразрешенных внешних элементов: 1 2) Ошибка LNK2019 ссылка...

Как создать динамический массив объектов базового класса и заполнить его наследниками базового класса?
#include &lt;iostream&gt; using namespace std; class P { int p; public: P() {

Вызвать конструктор производного класса без конструктора базового класса
Здравствуйте! У меня есть базовый класс треугольник и производный класс равносторонний...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru