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;
        }                
   };

主要:

     Base *varBase;
     Derived varDerived;

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

大家好,

我试图了解对象切片并尝试一些示例程序。

我用指针参考objcet切片读取某个地方不会发生。

但是以下例子我注意到 iDerived 无法从 Base pointer(varBase), ,但是从 virtual display method of class 即使不在显示方法的本地范围中,我也可以访问。

现在我的问题是:

  1. 为什么我只能使用虚拟函数访问IDERIDER变量,这是正确的吗?
  2. 如何避免对象切片。
有帮助吗?

解决方案

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; }
};

对象切片完全无关,并且在您的示例中不会发生。

其他提示

您的示例代码根本不涉及切片。您所做的只是调用基本多态性。通过声明 Base::display() 作为 virtual 并通过打电话 display()Base *, ,您已要求它在 实际的 指向对象的类型 Derived. 。成员变量 DerivedDerived::display(), ,这就是为什么它编译和工作。

但是,您只能直接访问成员变量(或函数)在 根据 通过指针到Base. 。这就是为什么 varBase->iDerived 不编译。

切片通常涉及等于:

Derived d;
Base b = (Base)d;

通过明确分配/初始化 Base 对象,所有 Derived- 特定的成员将丢失(即他们被“切成薄片”)。

这些东西相对基本;我建议您在C ++上挑选一本不错的书。这里有一份好列表: 确定的C ++书籍指南和列表.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top