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