【发布时间】:2015-10-12 17:08:11
【问题描述】:
我试图理解访问派生对象成员背后的逻辑。我有两个指针:如果我通过指向派生类的指针更改派生类中的变量,我注意到我无法通过指向基类的指针的继承类型访问变量的值。
#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 有两个不同的值。让我感到困扰的是,例如,当我使用多个列表工作时:一个主列表,其中包含指向我所有对象(比如某个动物类)的指针和一个辅助列表——主列表的子样本,其中包含指向某些对象的指针对象(比如爬虫类:公共动物,公共捕食者)——碰巧我希望通过第二个列表(布尔 is_currently_in_water)修改这些成员的值,我不能以一种直接(而且对我来说很直观)的方式做到这一点.我必须跟踪主列表并首先找出哪个动物对象是爬行动物,以便通过主列表进行必要的更改。
多态性是这样设计的吗?这可能是一个非常基本的问题,因为我刚开始学习 C++,虽然我知道如何克服更改代码的问题,但我首先尝试完全掌握发生了什么,因为上述结果相当令人惊讶。
【问题讨论】:
标签: c++ pointers inheritance