虚拟方法不作用于虚拟

Virtual methods not acting virtual

本文关键字:虚拟 作用于 方法      更新时间:2023-10-16

请考虑以下代码:

#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();一样调用也能表现为虚函数。

您的向量V包含A对象,因此没有动态调度的范围。你总是在打电话给A::value().将对象的B部分复制到矢量中时,它们将被切掉。它与执行此操作相同:

B b(1);
A a1 = b;  // a1 is an A object, not a B.
a1.value();

请参阅对象切片。

因为当你这样做时y.push_back(b);切片就会发生;vector保存类型为A的对象。要使用多态性,您需要引用或指针。