【发布时间】:2015-02-23 15:40:41
【问题描述】:
#include <iostream>
#include <string>
class A
{
public:
A(int a) : _a(a) {}
virtual ~A() {}
virtual void f() const {std::cout << _a << std::endl;}
private:
int _a;
};
class B : public A
{
public:
B(int a, int b) : A(a), _b(b) {}
virtual void f() const {std::cout << _b << std::endl;}
private:
int _b;
};
int main()
{
B b (1,2);
A a (5);
A& ref = a;
ref = b;
ref.f();
return 0;
}
输出:
1
我了解在将派生(扩展)类对象复制到基类对象时,派生对象被剪切并且仅复制基类数据。但我认为'ref'的虚拟表现在应该是'b'的虚拟表所以'ref.f();'应该调用函数:
void B::f() const {std::cout << _b << std::endl;}
但是在复制'ref'的vtbl之后仍然是A类的vtbl。为什么? 谢谢。
【问题讨论】:
-
覆盖 A 的赋值运算符以查看发生了什么。
-
正如在一些答案中所指出的,C++ 引用与基本上所有其他语言的引用完全不同。要在 C++ 中获得这种行为,您应该使用指针。
-
问题:如何重新设置引用以使其引用不同的对象?答:没办法。 isocpp.org/wiki/faq/references#reseating-refs