Почему стандарт 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?
Надеюсь, на этот раз я выразил свой вопрос лучше.
Спасибо