#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;
实际上是什么意思呢?
什么ref = d2
实际上做的是分配价值的d2
到d1
-但是,它仍然d1
被称为通过ref
。因为d1
仍然被引用,调用ref.f
仍然打印Derived1
。
假设您v
向基类添加了一个数据值- 将其设置为1
ind1
和2
in 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)
希望这使它更清楚一些。
祝你好运。
归档时间: |
|
查看次数: |
2721 次 |
最近记录: |