虚拟方法不是虚拟的

时间:2013-10-15 15:23:46

标签: c++ function class inheritance virtual

请考虑以下代码:

#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();时也可以表现为虚函数。

2 个答案:

答案 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类型的对象。要使用多态,需要引用或指针。