通过指向派生类的指针访问派生成员变量

时间:2015-10-12 17:08:12

标签: c++ pointers inheritance

我尝试理解访问派生对象成员的逻辑。我有两个指针:如果我通过指向派生类的指针更改派生类中的变量,我注意到我无法通过指向基类的继承类型来访问变量的值。

#include <iostream>
#include <string>

class A
    {
    public:
        int x;
    };

class B : public A
    {
    public:
        int y;
    };

int main()
    {
    B* pB = new B;
    A* pA = new B;

    std::cout<<"Changing x via pB to 11"<<std::endl;
    pB->x=11;
    std::cout<<"This is x: " << pB->x<<std::endl;
    std::cout<<"What about this x: " << pA->x<<std::endl<<std::endl;

    std::cout<<"Changing x via pA to 42"<<std::endl;
    pA->x=42;
    std::cout<<"This is my new x: " << pB->x<<std::endl;
    std::cout<<"and what about this x now: " << pA->x;

    delete pA;
    delete pB;
    }

输出:

  

通过pB将x更改为11
  这是x:11
  那x:0

怎么样?      

通过pA将x更改为42
  这是我的新x:11
  现在这个x怎么样:42

我想知道发生了什么以及为什么x有两个不同的值。令我困扰的是,当我工作时,例如,有多个列表:一个主列表,指向所有对象(比如一些动物类)和一个辅助列表 - 一个主列表的子样本,指向一些对象(比如类爬行动物:公共动物,公共捕食者) - 我希望通过第二个列表(bool is_currently_in_water)来修改这些成员的值,我不能以直截了当(以我直观的方式)这样做。我必须跟踪主列表并首先找出哪个动物对象是爬行动物,以便通过主列表进行必要的更改。

多态是否意味着这样?这可能是一个非常基本的问题,因为我是学习C ++的开始,虽然我知道如何克服这个问题,但是我改变了我的代码,我首先想要完全掌握正在发生的事情,因为上面的结果是相当令人惊讶的。

3 个答案:

答案 0 :(得分:2)

  

我想知道发生了什么以及为什么x有两个不同的值。

解释非常简单:您有两个x值,因为您有两个类型B的单独对象,通过两个指针pApB引用,是完全独立的。

当您打印pB->x时,打印x附加到您先分配的对象;当您打印pA-X时,打印附加到您已分配的对象的x。这两个对象不共享成员变量,因此它们的x彼此独立。

如果您希望在两个不同类型的指针引用同一个对象时看到行为,请执行以下操作:

B* pB = new B;
A* pA = pB;

现在pApB指向同一个对象,因此通过一个指针对x的任何更改都是&#34;可见&#34;通过另一个指针。当然,现在只有一个分配,您需要删除delete pA(或delete pB,如果您愿意),以避免双重删除同一个对象。

答案 1 :(得分:0)

有两个不同的值,因为您有两个不同的对象:

B* pB = new B;
A* pA = new B;

对象pA指向与pB个点无关。并且,在第一个

std::cout<<"What about this x: " << pA->x<<std::endl<<std::endl;

您正在阅读未初始化的数据,这是未定义的行为。

答案 2 :(得分:0)

你试图从两个不同的对象中读取x。

如果要使用父指针引用对象,则需要定义父指针,如下所示

B* pB = new B;
A* pA = pB;

现在,如果你从指针pA改变x,它也会在pB上改变。