簡體   English   中英

通過指向派生類的指針訪問派生成員變量

[英]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對象,它們通過兩個指針pApB引用,這兩個指針彼此完全獨立。

當打印pB->x ,打印x附加到您首先分配的對象上。 當您打印pA-X ,您將打印附加到第二個分配對象的x 這兩個對象不共享成員變量,因此它們的x彼此獨立。

如果您希望看到兩個不同類型的指針指向同一個對象時的行為,請執行以下操作:

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

現在pApB指向同一個對象,因此通過一個指針對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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM