如何从派生类访问引用成员变量?

时间:2019-08-28 12:17:41

标签: c++ inheritance reference

当我从派生类中打印参考成员变量时,它显示错误。但是从主要班级来看,这显示出适当的结果。 请让我知道如何在派生类中获取引用成员。

谢谢

我有以下示例代码:

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,而不是随机值。请给我建议解决方法。

1 个答案:

答案 0 :(得分:0)

所以在这段代码中

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构造函数来移动而不是复制。