Почему в C ++ нужен «объектный фрагмент»? Почему это разрешено? Есть еще ошибки?

Почему стандарт C ++ позволяет срезать объекты?

Пожалуйста, не объясняйте мне концепцию среза объекта в C ++, поскольку я это знал.

Мне просто интересно, каково намерение этой функции C ++ (объектного фрагмента)?

Чтобы получить больше ошибок новичка?

Разве для С ++ не было бы более безопасным по типу предотвращение среза объекта?

Ниже приведен только стандартный и базовый пример среза:

class Base{
public:
       virtual void message()
       {
               MSG("Base ");
       }
private:
    int m_base;
};

class Derived : public Base{
public:
       void message()
       {
               MSG("Derived "); 
       }
private:
       int m_derive;
};

int main (void)
{
    Derived dObj;

    //dObj get the WELL KNOWN c++ slicing below
    //evilDerivedOjb is just a Base object that cannot access m_derive
    Base evilDerivedOjb = dObj;  //evilDerivedObj is type Base
    evilDerivedOjb.message();    //print "Baes" here of course just as c++ standard says
}

Заранее спасибо.

=============================================== ================================== Прочитав все ответы и комментарии, я думаю, что мне следует Прежде всего, лучше сформулируйте мой вопрос, но вот он:

При наличии отношения «есть-есть» (публичное наследование) вместо частного / защищенного наследования вы можете сделать следующее:

class Base{
public:
    virtual void foo(){MSG("Base::foo");}
};

class Derived : public Base{
public:
    virtual void foo(){MSG("Derived::foo");}
};

int main (void)
{
    Base b;
    Derived d;
    b = d;                      //1
    Base * pB = new Derived();  //2
    Base& rB = d;               //3

    b.foo();    //Base::foo
    pB->foo();  //Derived::foo
    rB.foo();   //Derived::foo
}

Хорошо известно, что только 2 и 3 работают полиморфно, в то время как один - это печально известный объект нарезки, который не производит ничего, кроме ошибки!

Примечание 1, 2 и 3 НЕОБХОДИМОСТЬ - отношение к работе.
Если вы используете частное / защищенное наследование, вы получите ошибку компиляции для всех из них:

'type cast' : conversion from 'Derived *' to 'const Base &' exists, but is inaccessible
'type cast' : conversion from 'Derived *' to 'Base *' exists, but is inaccessible
'type cast' : conversion from 'Derived *' to 'Base &' exists, but is inaccessible

Итак, мой вопрос (первоначальное намерение) заключался в том, чтобы спросить, не лучше ли будет стандарт C ++ {{1 }} сделать 1 ошибкой компиляции, сохранив при этом 2 и 3?

Надеюсь, на этот раз я выразил свой вопрос лучше.

Спасибо

11
задан Gob00st 23 September 2011 в 11:03
поделиться