powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите разобраться с приведением типов
6 сообщений из 6, страница 1 из 1
Помогите разобраться с приведением типов
    #38825033
dghsf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет!
Прошу не пинать ногами - только начал изучать
есть два класса базовый и наследник

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
class ClB
{
protected:
    string str1;
public:
    const string& getStr1() const { return str1; };
    void setStr1(const string& str1)
    {
        this->str1 = str1;
    };
};

class ClB1 : public ClB
{
private:
    string clb1Str1;
public:
    const string& getClb1Str1() const { return clb1Str1; };
    void setClb1Str1(const string& clb1Str1)
    {
        this->clb1Str1 = clb1Str1;
    };
};



вопрос почему это работает
Код: plaintext
1.
2.
ClB* c = new ClB1();
((ClB1*)c)->setClb1Str1("Test");


, а это выдает ошибку
Код: plaintext
1.
2.
ClB c = ClB1();
((ClB1)c).setClb1Str1("Test");
...
Рейтинг: 0 / 0
Помогите разобраться с приведением типов
    #38825081
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dghsf, а это выдает ошибку
Код: plaintext
1.
2.
ClB c = ClB1();
((ClB1)c).setClb1Str1("Test");




При инициализации ClB c происходит срезка. Тип переменной с у тебя ClB.

Перепишы класс так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class ClB
{
protected:
    string str1;
public:
    ClB( const ClB &r ) : str1(r.str1) { std::cout << "ClB copy constructor called" << std::endl; }
    const string& getStr1() const { return str1; };
    void setStr1(const string& str1)
    {
        this->str1 = str1;
    };
};



Узнаешь много нового...
...
Рейтинг: 0 / 0
Помогите разобраться с приведением типов
    #38825082
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Помогите разобраться с приведением типов
    #38825143
dghsf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
честно говоря не понял, для чего нужно было переписывать класс - это проблему не решило
Я так полагаю что ответ на мой вопос в статье по ссылке http://en.wikipedia.org/wiki/Object_slicing , а именно

авторUnexpected object slicing can happen in languages such as C++ in which assignment by value is not polymorphic


или я чтото не совсем понял?
...
Рейтинг: 0 / 0
Помогите разобраться с приведением типов
    #38825163
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dghsf,

dghsf,

Суть в том, что при создании ClB c = ClB1() срабатывает копирующий конструктор по умолчанию, который копирует из временного объекта типа ClB1 только поле str1. Вызов ((ClB1)c).setClb1Str1() пытается обратиться к участку памяти, занятому объектом c, как к объекту ClB1, которого там нет.
В случае ClB* c = new ClB1() создаётся именно объект типа ClB1, и с ним вызов метода срабатывает.
...
Рейтинг: 0 / 0
Помогите разобраться с приведением типов
    #38825183
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dghsfчестно говоря не понял, для чего нужно было переписывать класс - это проблему не решило


Это не должно было решить проблему . Это должно было показать тебе её причину.

dghsfЯ так полагаю что ответ на мой вопос в статье по ссылке http://en.wikipedia.org/wiki/Object_slicing , а именно

авторUnexpected object slicing can happen in languages such as C++ in which assignment by value is not polymorphic


или я чтото не совсем понял?

Да, да, всё так.

Правда, они там херню написали в этой википедии (как и часто бывает).
assignment by value -- операция полиморфная. Только переменная целевая неполиморфная.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите разобраться с приведением типов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]