gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 03:52:59 25 4
gpt4 key购买 nike

    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 方法访问 即使它不在显示方法的本地范围内,我也可以访问。

现在我的问题是:

  1. 为什么我只能通过虚函数访问 iDerived 变量,这样合适吗?
  2. 如何避免对象切片。

最佳答案

您的示例代码根本不涉及切片。您所做的只是调用基本多态性。通过将 Base::display() 声明为 virtual 并在 Base * 上调用 display(),您已要求它动态调用所指向对象的实际 类型的成员函数,即DerivedDerived 的成员变量在 Derived::display() 的范围内,因此它可以编译和工作。

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

切片通常涉及等同于:

Derived d;
Base b = (Base)d;

通过显式分配/初始化一个 Base 对象,所有 Derived 特定的成员都将丢失(即它们已被“切”掉)。

这个东西比较基础;我建议买一本不错的 C++ 书籍。这里有一个好的列表:The Definitive C++ Book Guide and List .

关于c++ - C++中的对象切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4780067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com