¿Por qué se necesita 'corte de objeto' en C ++? ¿Por qué está permitido? Para más errores?

¿Por qué el estándar C ++ permite el corte de objetos?

Por favor, no me explique el concepto de división de objetos de C ++ como lo sabía.

Me pregunto cuál es la intención detrás de este diseño de la función c ++ (división de objeto).

¿Para que el principiante tenga más errores?

¿No sería más seguro para C ++ evitar el corte de objetos?

Below es solo un ejemplo de segmento estándar y básico:

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
}

Gracias por adelantado

================================================= ================================ Después de leer todas las respuestas y comentarios, creo que debería expresar mejor mi pregunta al principio lugar pero aquí viene:

Cuando haya una relación is-a (herencia pública), en lugar de una herencia privada / protegida, puede hacer lo siguiente:

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
}

¡Es bien sabido que solo 2 y 3 funcionan polimórficamente, mientras que uno es el infame rebanador de objetos que no produce más que un error!

Nota 1, 2 y 3NECESITA es una relación con el trabajo.
Si está utilizando una herencia privada / protegida, obtendrá un error de compilación para todos ellos:

'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

Así que mi pregunta (intención original) era preguntar ¿sería mejor si el estándar c ++ hace que 1 sea un error de compilación mientras sigue permitiendo 2 y 3?

Espero haber expresado mi pregunta mejor esta vez.

Gracia

Respuestas a la pregunta(5)

Su respuesta a la pregunta