![](/img/trans.png)
[英]Vector of pointers to base class containing base and derived class objects - accessing derived-class specific variables
[英]accessing derived member variables via pointers to derived class
我試圖理解訪問派生對象成員背后的邏輯。 我有兩個指針:如果我通過指向派生類的指針來更改派生類中的變量,我會注意到我無法通過指向基類的指針的繼承類型來訪問變量的值。
#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 ++的人,盡管我知道如何克服更改代碼的問題,但由於上述結果令人驚訝,因此我首先嘗試完全掌握正在發生的事情。
我想知道發生了什么,為什么
x
有兩個不同的值。
解釋很簡單:您有x
兩個值,因為您有兩個單獨的類型B
對象,它們通過兩個指針pA
和pB
引用,這兩個指針彼此完全獨立。
當打印pB->x
,打印x
附加到您首先分配的對象上。 當您打印pA-X
,您將打印附加到第二個分配對象的x
。 這兩個對象不共享成員變量,因此它們的x
彼此獨立。
如果您希望看到兩個不同類型的指針指向同一個對象時的行為,請執行以下操作:
B* pB = new B;
A* pA = pB;
現在pA
和pB
指向同一個對象,因此通過一個指針對x
所做的任何更改都將通過另一個指針“可見”。 當然,既然只有一種分配,則需要刪除delete pA
(或根據需要delete pB
),以避免重復刪除同一對象。
有2個不同的值,因為您有2個不同的對象:
B* pB = new B;
A* pA = new B;
pA
指向的對象與pB
指向的對象沒有任何關系。 而且,在第一個
std::cout<<"What about this x: " << pA->x<<std::endl<<std::endl;
您正在讀取未初始化的數據,這是未定義的行為。
您試圖從兩個不同的對象讀取x。
如果要使用父指針引用對象,則需要定義父指針,如下所示
B* pB = new B;
A* pA = pB;
現在,如果您從指針pA更改x,則x也會在pB上更改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.