#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;
是什么意思?
答案 0 :(得分:3)
ref = d2
实际执行的操作是将d2
的值分配给d1
- 但是,它仍然是d1
ref
提到的。由于仍然引用d1
,因此调用ref.f
仍会打印Derived1
。
假设您向基类添加了数据值v
- 将其设置为1
中的d1
和2
中的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
。