C++ c+中的对象切片+;

C++ c+中的对象切片+;,c++,inheritance,object-slicing,C++,Inheritance,Object Slicing,大家好 我试图理解对象切片并尝试使用一些 示例程序 我在某个地方读到了指针引用Objcet切片将不会 发生 但通过下面的示例,我注意到,iDerived无法从Base指针(varBase)访问,但可以从类的虚拟显示方法访问,即使它不在显示方法的本地范围内 现在我的问题是: 为什么我只能使用虚函数访问IDERIVE变量,这是否正确 如何避免对象切片 您的示例代码根本不涉及切片。您所做的就是调用基本多态性。通过将Base::display()声明为virtual,并在Base*上调用display(

大家好

我试图理解对象切片并尝试使用一些 示例程序

我在某个地方读到了指针引用Objcet切片将不会 发生

但通过下面的示例,我注意到,
iDerived
无法从
Base指针(varBase)
访问,但可以从类的
虚拟显示方法访问,即使它不在显示方法的本地范围内

现在我的问题是:

  • 为什么我只能使用虚函数访问IDERIVE变量,这是否正确
  • 如何避免对象切片
    您的示例代码根本不涉及切片。您所做的就是调用基本多态性。通过将
    Base::display()
    声明为
    virtual
    ,并在
    Base*
    上调用
    display()
    ,您已经要求它动态调用所指向对象的实际类型中的成员函数,该对象是
    派生的
    Derived
    的成员变量在
    Derived::display()
    的范围内,因此它可以编译并工作

    但是,您只能通过指向-
    Base
    的指针直接访问Base中声明的成员变量(或函数)。这就是
    varBase->iDerived
    不编译的原因

    切片通常涉及相当于以下内容:

         Base *varBase;
         Derived varDerived;
    
         varBase = &varDerived;
         varBase->display();
         varBase->iDerived=10; // Error: iDerived is not a member of Base: ?????
    
    通过显式分配/初始化
    基本
    对象,所有
    派生的
    特定成员都将丢失(即,它们已被“切掉”)


    这个东西比较基础,;我建议在C++上选一本体面的书。这里有一个好的列表:。

    C++有虚拟函数,但没有虚拟数据

    您可以添加以下内容来模拟它:

    Derived d;
    Base b = (Base)d;
    

    对象切片是完全不相关的,在您的示例中不会发生。

    谢谢您的回复。我的问题是,我无法使用IDERIVE brom Base*(根据错误,它不在Base*的范围内)。我怎样才能从display()访问。@user:哦,对不起,我错过了你问题的那一部分。我会更新我的答案,等等!这是我的错误,我必须让我的问题更容易理解。我已经格式化以增加可读性。
    Derived d;
    Base b = (Base)d;
    
    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; }
    };