Почему стандарт С++ разрешает срез объекта?
Пожалуйста, не объясняйте мне концепт среза объекта С++, поскольку я знал это.
Мне просто интересно, какое намерение стоит за этой конструкцией С++ (объект slice)?
Чтобы получить новичков больше ошибок?
Не было бы более безопасным для С++ предотвращать срез объекта?
Ниже приведен только стандартный и стандартный пример среза:
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
}
Спасибо заранее.
=============================================== ================================== Прочитав все ответы и комментарии, я думаю, что должен лучше выразить свой вопрос в первую очередь, но здесь он приходит:
Если существует отношение is-a (public inheritnace), вместо частного/защищенного наследования, вы можете сделать следующее:
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
Итак, мой вопрос (первоначальное намерение) состоял в том, чтобы спросить, было бы лучше, если бы стандарт С++ сделать 1 ошибку компиляции, сохраняя возможность 2 и 3?
Надеюсь, что на этот раз я выразил свой вопрос.
Спасибо