Помогите разобраться с приведением типов

dghsf
Дата: 04.12.2014 15:37:33
Привет!
Прошу не пинать ногами - только начал изучать
есть два класса базовый и наследник

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;
    };
};


вопрос почему это работает
ClB* c = new ClB1();
((ClB1*)c)->setClb1Str1("Test");

, а это выдает ошибку
ClB c = ClB1();
((ClB1)c).setClb1Str1("Test");
MasterZiv
Дата: 04.12.2014 16:01:09
dghsf
, а это выдает ошибку
ClB c = ClB1();
((ClB1)c).setClb1Str1("Test");



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

Перепишы класс так:
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;
    };
};


Узнаешь много нового...
RWolf
Дата: 04.12.2014 16:01:46
dghsf
Дата: 04.12.2014 16:34:57
честно говоря не понял, для чего нужно было переписывать класс - это проблему не решило
Я так полагаю что ответ на мой вопос в статье по ссылке 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


или я чтото не совсем понял?
RWolf
Дата: 04.12.2014 16:47:59
dghsf,

dghsf,

Суть в том, что при создании ClB c = ClB1() срабатывает копирующий конструктор по умолчанию, который копирует из временного объекта типа ClB1 только поле str1. Вызов ((ClB1)c).setClb1Str1() пытается обратиться к участку памяти, занятому объектом c, как к объекту ClB1, которого там нет.
В случае ClB* c = new ClB1() создаётся именно объект типа ClB1, и с ним вызов метода срабатывает.
MasterZiv
Дата: 04.12.2014 17:00:05
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 -- операция полиморфная. Только переменная целевая неполиморфная.