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

Gil*_*esz 4 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;
}
Run Code Online (Sandbox Code Playgroud)

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

派生 1 派生 1

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

Bob*_*ica 5

什么ref = d2实际上做的是分配价值d2d1-但是,它仍然d1被称为通过ref。因为d1仍然被引用,调用ref.f仍然打印Derived1

假设您v向基类添加了一个数据值- 将其设置为1ind12in d2。将您的实现更改f为 print 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;
}
Run Code Online (Sandbox Code Playgroud)

运行时将打印:

Derived1 : v=1
Derived1 : v=2
Run Code Online (Sandbox Code Playgroud)

希望这使它更清楚一些。

祝你好运。