C ++可以重新分配引用吗?

时间:2016-03-16 10:52:48

标签: c++

#include <iostream>
using namespace std;

class Base{
    public:
    virtual void f(){
        std::cout << "Base\n";
    }
};

class Derived1 : public Base{
    public:
    void f(){
        std::cout << "Derived1\n";
    }

};

class Derived2 : public Base{
    public:
    void f(){
        std::cout << "Derived2\n";
    }
};




int main() {
    Derived1 d1;
    Derived2 d2;

    Base& ref = d1;
    ref.f();
    ref = d2;
    ref.f();

    return 0;
}

据说无法重新分配引用。在这里,编译器接受此代码并且输出对我来说是不可理解的。 输出:

  

Derived1   Derived1

那么,实际上意味着ref = d2;是什么意思?

2 个答案:

答案 0 :(得分:3)

ref = d2实际执行的操作是将d2分配给d1 - 但是,它仍然是d1 ref提到的。由于仍然引用d1,因此调用ref.f仍会打印Derived1

假设您向基类添加了数据值v - 将其设置为1中的d12中的d2。将您的f实施更改为打印v。你会得到类似的东西:

#include <iostream>
using namespace std;

class Base{
    public:
    int v;

    virtual void f(){
        std::cout << "Base : v=" << v << "\n";
    }
};

class Derived1 : public Base{
    public:
    void f(){
        std::cout << "Derived1 : v=" << v << "\n";
    }

};

class Derived2 : public Base{
    public:
    void f(){
        std::cout << "Derived2 : v=" << v << "\n";
    }
};

int main() {
    Derived1 d1;
    d1.v = 1;
    Derived2 d2;
    d2.v = 2;

    Base& ref = d1;
    ref.f();
    ref = d2;
    ref.f();

    return 0;
}

运行时会打印:

Derived1 : v=1
Derived1 : v=2

希望这会让它更清晰。

祝你好运。

答案 1 :(得分:1)

无法重新分配参考文献。它们像变量的别名一样工作。

ref = d2调用分配Base类的运算符,并将Base变量的Derived2 d2部分复制到Derived1 d1