我尝试理解访问派生对象成员的逻辑。我有两个指针:如果我通过指向派生类的指针更改派生类中的变量,我注意到我无法通过指向基类的继承类型来访问变量的值。
#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 ++的开始,虽然我知道如何克服这个问题,但是我改变了我的代码,我首先想要完全掌握正在发生的事情,因为上面的结果是相当令人惊讶的。
答案 0 :(得分:2)
我想知道发生了什么以及为什么
x
有两个不同的值。
解释非常简单:您有两个x
值,因为您有两个类型B
的单独对象,通过两个指针pA
和pB
引用,是完全独立的。
当您打印pB->x
时,打印x
附加到您先分配的对象;当您打印pA-X
时,打印附加到您已分配的对象的x
。这两个对象不共享成员变量,因此它们的x
彼此独立。
如果您希望在两个不同类型的指针引用同一个对象时看到行为,请执行以下操作:
B* pB = new B;
A* pA = pB;
现在pA
和pB
指向同一个对象,因此通过一个指针对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上改变。