Нарезка объектов в c ++ - PullRequest
       39

Нарезка объектов в c ++

0 голосов
/ 24 января 2011
    class Base
    {  
         int iBase;

      public:           
         virtual void display()
         {
            cout<<"I am a Base Class"<<endl;
         }        
    };

    class Derived : public Base
    { 
        int iDerived;

     public:
        Derived()
        {
            cout<<"In Derived Default Constructor"<<endl;
            iDerived=10;
        }   

        void display()
        {
            cout<<"I am in Derived Class"<<endl;
            cout<<"value of iDerived  :"<<iDerived<<endl;
            iDerived=100;
            cout<<"value of iDerived  :"<<iDerived<<endl;
        }                
   };

В MAIN:

     Base *varBase;
     Derived varDerived;

     varBase = &varDerived;
     varBase->display();
     varBase->iDerived=10; // Error: iDerived is not a member of Base: ?????

Привет всем,

Я пытаюсь разобраться с нарезкой объектов и пытаюсь использовать некоторые примеры программ.*

Я читаю где-то с указателем ссылки Objcet Slicing не произойдет.

Но в приведенном ниже примере я замечаю, что iDerived недоступен из Base pointer(varBase), но из virtual display method of class я могу получить доступ, даже если это не входит в локальную область метода отображения.

Теперь мой вопрос:

  1. Почему я могу получить доступ к переменной iDerived только через виртуальную функцию, верно?
  2. Как избежать нарезки объектов.

Ответы [ 2 ]

2 голосов
/ 24 января 2011

Ваш пример кода вообще не включает нарезку.Все, что вы сделали, это применили базовый полиморфизм.Объявляя Base::display() как virtual и вызывая display() для Base *, вы попросили его динамически вызывать функцию-член в типе фактического объекта, на который указывает, который являетсяDerived.Переменные-члены Derived находятся в области действия Derived::display(), поэтому они компилируются и работают.

Однако вы можете напрямую обращаться только к переменным-членам (или функциям), объявленным в Base через указатель на Base.Вот почему varBase->iDerived не компилируется.

Слайс обычно включает в себя что-то эквивалентное:

Derived d;
Base b = (Base)d;

Путем явного присвоения / инициализации объекта Base, все Derived -специфичныечлены будут потеряны (то есть они были «вырезаны»).

Этот материал относительно фундаментален;Я бы предложил подобрать приличную книгу по C ++.Здесь есть список хороших: Руководство к книге по C ++ и список .

0 голосов
/ 24 января 2011

C ++ имеет виртуальные функции, но не имеет виртуальных данных.

Вы можете добавить следующее, чтобы смоделировать его:

class Base {
  // What you had before
  virtual int getAnInt() const = 0; // =0 means that Derived must implement this
};
class Derived {
  // What you had before
  virtual int getAnInt() const { return iDerived; }
};

Разрезание объектов совершенно не связано и не происходит в вашем примере.

...