![](/img/trans.png)
[英]How to access a derived class member from const base class reference?
[英]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.