题
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
即使不在显示方法的本地范围中,我也可以访问。
现在我的问题是:
- 为什么我只能使用虚拟函数访问IDERIDER变量,这是正确的吗?
- 如何避免对象切片。
解决方案
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
. 。成员变量 Derived
在 Derived::display()
, ,这就是为什么它编译和工作。
但是,您只能直接访问成员变量(或函数)在 根据 通过指针到Base
. 。这就是为什么 varBase->iDerived
不编译。
切片通常涉及等于:
Derived d;
Base b = (Base)d;
通过明确分配/初始化 Base
对象,所有 Derived
- 特定的成员将丢失(即他们被“切成薄片”)。
这些东西相对基本;我建议您在C ++上挑选一本不错的书。这里有一份好列表: 确定的C ++书籍指南和列表.
不隶属于 StackOverflow