请考虑以下代码:
#include<iostream>
#include<vector>
class A
{
public:
A(int n = 0) : m_n(n) {}
public:
virtual int value() const {return m_n;}
virtual ~A() {}
protected:
int m_n;
};
class B : public A
{
public:
B(int n = 0) : A(n){}
public:
virtual int value() const {return m_n + 1;}
};
int main(char* args[])
{
const A a(1);
const B b(3);
const A *x[2] = {&a, &b};
typedef std::vector<A> V;
V y;
y.push_back(a);
y.push_back(b);
V::const_iterator i = y.begin();
std::cout << x[0]->value() << x[1]->value()
<< i->value() << (i+1)->value() << std::endl;
getchar();
return 0;
}
为什么打印出1413
而不是1414
?我希望value()
即使在调用(i+1)->value();
时也可以表现为虚函数。
答案 0 :(得分:5)
您的向量V
包含A
个对象,因此没有动态调度的余地。你总是打电话给A::value()
。当对象的B
部分被复制到向量中时,它会被切掉。这与此相同:
B b(1);
A a1 = b; // a1 is an A object, not a B.
a1.value();
请参阅object slicing。
答案 1 :(得分:3)
因为当你做y.push_back(b);
切片时; vector
保存A
类型的对象。要使用多态,需要引用或指针。