【问题标题】:Virtual methods not acting virtual虚拟方法不虚拟
【发布时间】:2013-10-23 11:37:09
【问题描述】:

考虑以下代码:

#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)-&gt;value(); 这样调用时也能表现得像一个虚函数。

【问题讨论】:

标签: c++ function class inheritance virtual


【解决方案1】:

您的向量V 包含A 对象,因此没有动态调度的范围。你总是打电话给A::value()。对象的B 部分在复制到向量中时会被切掉。和这样做是一样的:

B b(1);

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

object slicing

【讨论】:

    【解决方案2】:

    因为当您执行y.push_back(b); 时,会发生切片; vector 包含 A 类型的对象。要使用多态性,您需要引用或指针。

    【讨论】:

      猜你喜欢
      • 2013-05-01
      • 1970-01-01
      • 2011-09-30
      • 2015-09-09
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多