【发布时间】:2021-03-31 06:44:58
【问题描述】:
在下面的代码中
#include <iostream>
using namespace std;
class A {
};
class B : public A {
};
class C {
public:
void foo(const A& a) { cout << "A";}
void foo(const B& b) { cout << "B";}
};
int main() {
C c;
const A& o = B();
c.foo(o);
}
我希望结果是“B”,而不是“A”。
有什么方法可以在不求助于dynamic_cast 的情况下拨打void foo(const B& b) 吗?
编辑:我想要实现的是让不同的函数从 C 中获取不同的资源(即一些成员变量)。我可以在 A 和 B 上使用虚函数并做这样的事情
void foo(const A& o) {
o.bar(this)
}
然后A或B会从C那里收集资源,但我不想让A或B知道C。
【问题讨论】:
-
重载什么也没听到。看看虚函数。
-
好的,首先,行为是未定义的,因为
const A& o = B();存储了对已销毁对象的引用。其次,o的 type 只知道是A或某个子类的实例。它无法知道o实际上是指B实例。 -
@paddy - 没有任何未定义的东西。这属于参考寿命延长的情况。
-
@paddy 为什么它不知道?编译器知道 o 是 B 的子类。
-
我猜是什么让 OP 想要
c.foo(o);打印B?编译器必须做正确的事情 (TM) 以延长临时B的生命周期?