我有这样的事情:
#include <iostream>
class X;
class A {
public:
virtual void bar(X &x);
};
class B : public A {
public:
};
class X {
public:
void foo(A &a) { std::cout << "foo A" << std::endl; }
void foo(B &b) { std::cout << "foo B" << std::endl; }
};
void A::bar(X &x) { x.foo(*this); }
int main(int argc, char **argv) {
X x;
B b;
b.bar(x);
return 0;
}
编译并执行它,你将拥有:
# ./a.out
foo A
#
我相信这是因为对象在投射到 A 时被切片。我怎样才能避免这种情况,所以我得到
foo B
没有在 B 中实现该方法或使用一些奇怪的东西,比如Curiously recurring 模板模式?