簡體   English   中英

如何從派生類訪問引用成員變量?

[英]How do I access reference member variable from derived class?

當我從派生類中打印引用成員變量時,它顯示錯誤。 但是從主要班級來看,這顯示出適當的結果。 請讓我知道如何獲取派生類中的參考成員。

謝謝

我有以下示例代碼:

class sample {
    int a;
    public:
    sample(int a_): a(a_){}
    int geta(){ return a; }
};

class base {
protected:
    const int& i;
    const sample& a;
public:
    base(int i_, sample a_):i(i_), a(a_){}
    const int& geti(){ return i; };
    sample getsample(){ return a; };
    virtual void samplefunction() = 0;
};

class derived : public base {
public:
    const int& jt;
    derived(int i, sample a, int jt_): base(i,a), jt(jt_){}
    void samplefunction() { 
        cout<< "geti from derived. " << geti() << endl;
    };
};

int main()
{
    sample ob(20);
    derived *bob = new derived(50, ob, 2002);
    // bob->samplefunction();
    cout << "geti from main. " << bob->geti() << endl;
    bob->samplefunction();

    // cout << "bob inside samplefunction";
    return 0;
}

我得到的輸出如下:從主葛蒂。 50蓋蒂派生自。 13307456

從我調用geti的示例函數中,必須打印50,而不是隨機值。 請給我建議解決方案。

所以在這段代碼中

base(int i_, sample a_):i(i_), a(a_){}

i_僅存在於base構造函數中。 但是,你參考吧i存在,只要base對象存在。 這是根本問題,您的引用存在的時間比其引用的對象存在的時間長。 這就是為什么您看到“隨機”數字的原因。 並請注意, a_a存在完全相同的問題。 進行此工作的唯一方法是使構造函數的參數也成為引用。 像這樣

base(const int& i_, sample a_):i(i_), a(a_){}

和這個

derived(const int& i, sample a, int jt_): base(i,a), jt(jt_){}

main

int fifty = 50;
sample ob(20);
derived *bob = new derived(fifty, ob, 2002);

現在,您所有的參考文獻都引用了fifty ,與main一樣存在。 因此,您可以避免此問題。

希望這可以解釋問題,但是正如上面的評論中已經提到的,正是由於生命周期的問題,將引用放入類幾乎總是一個壞主意。 一般而言,類應獲取用於構造它們的對象的副本,如果副本太昂貴,則使用move構造函數移動而不是copy。

暫無
暫無

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

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