簡體   English   中英

C ++中的繼承類中存儲的變量在哪里/

[英]Where are variables stored in Inherited Classes in C++/

有幾個類似的問題,但沒有一個回答我在C++中對inheritance不理解的地方。

我有一個簡單的父母和孩子 class 孩子從父母那里繼承。 這里的示例只有一個與父級完全相同的子級,但它的 integer a 的值始終為 0。

classes.h

#ifndef CLASSES_H
#define CLASSES_H

class Parent {
    private:
        int a,b;

    public:
        Parent():a(0), b(0){};
        Parent(int a, int b):a(a), b(b){};

        int getA(){return this->a;}
        int getB(){return this->b;}

};

class Child: public Parent {
    
    public:
        Child(){Parent();};
        Child(int b){Parent(0, b);};
};


#endif

main.cpp

#include "classes.h"
#include <iostream>

using std::cout;
using std::endl;

int main(){
    int a = 2;
    int b = 4;
    Parent parent = Parent(a, b);
    Child child = Child(b);

    cout << "Parent: A=" << parent.getA() << " : B=" << parent.getB() << endl;
    cout << "Child: A=" << child.getA() << " : B=" << child.getB() << endl;

    return 0;
}

output

Parent: A=2 : B=4
Child: A=0 : B=0

我會簡單地期望Child: A=0: B=4在第二行,但事實並非如此。

查看其他問題,我發現如果我希望 Child 能夠直接訪問私有變量,則它們需要受到保護或公開。 但是我也看到了一句話

派生的 class 不繼承對私有數據成員的訪問。 但是,它確實繼承了完整的父級 object,其中包含 class 聲明的所有私有成員

我想了解的是您如何“訪問”此父類 object。我是否應該將其分配給構造函數中的某些內容,然后重寫 getter 類以基本上重定向到父類的 getter 函數? 因為這似乎違背了使用 OOP 來捕獲父行為的目的。 我認為(錯誤地)構造函數會在子構造函數中設置變量,但如果不是這種情況,那么在 Child 構造函數內部的 Parent 構造函數中初始化的那些變量必須在某個地方正確嗎?

我有一個與上面類似的設置,其中子級對父級稍作修改(對成員函數進行了一些更改)並且我能夠使用受保護的成員變量來處理它但我不確定它們是否最好 -實踐。

出了什么問題

孩子(int b){父母(0,b);};

該構造函數創建一個對構造函數本地的父對象,並在構造函數結束時離開 scope。 它不是新的 childs Parent(已默認構造)它是一個不同的臨時父級。

Child object 確實有父數據,只是你沒有設置而已。

孩子(int b):父母(0,b){}

將 b 傳遞給基本構造函數以獲得您期望的結果

“我想了解的是您如何“訪問”這個父 object。”

如果您想直接訪問 Parent 的成員數據,您可以保護該數據(甚至公開),但如果您的問題更多是關於如何讓您的 getter 訪問該數據,那么它已經在工作了。 只是您訪問的數據不是子構造函數主體中的數據集。

如果您在父構造函數上放置斷點並查看發生的情況,可能會幫助您自己證明這一點。 使用您的代碼版本,您應該看到父構造函數被調用了兩次。 首先,當 Child 的基礎 Parent 的構造發生時(在這種情況下通過默認構造函數)在 Childs 構造函數的主體開始之前,然后再次從 Child 構造函數的主體中調用。

如果您進行建議的編輯,您只會看到 Parent 構造函數被調用一次。

我認為您需要了解 private 應該實現的目標。

如果父 class 有變量(狀態),它明確想要保護派生 class 不被訪問,它將聲明它們是私有的。 這個限制沒有(容易或可讀),它專門用於阻止派生類直接訪問這些值。 通常有可用於更新或檢索這些私有值的受保護或公共函數 - 這允許父類 class 有機會將實現與派生類隔離。

如果您希望派生類能夠直接與數據交互,則將其聲明為受保護的——這就是受保護的目的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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