簡體   English   中英

誤解了虛函數在矢量中的作用

[英]Misunderstood the virtual functions work in vector

我在c ++上有以下代碼:

#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()
{
    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;

    system("PAUSE");

    return 0;
}

編譯器返回結果:1413。

我有點困惑,因為我認為正確的結果將是1414(作為虛擬函數)。 您如何解釋該程序的行為?

您正在切片對象,為了獲得多態性,您需要使用pointerreference 該示例盡可能接近您的原始示例並使用pointer將按照您的意願進行操作:

const A a(1);
const B b(3);

typedef std::vector<const A*> V;
V y;
y.push_back(&a);
y.push_back(&b);
V::iterator i = y.begin();

std::cout << (*i)->value()  << std::endl ;
++i ;
std::cout << (*i)->value()  << std::endl ;

要在此處簡要顯示對象切片的工作方式:

const A a(1);
const B b(3);
std::vector<A> y; // so y contains objects of type A

y.push_back(a);   // y[0] is copy-constructed from a
y.push_back(b);   // y[1] is copy-constructed from b

注意在這兩個push_back調用,它總是一個A正在建設中,通過自動生成的A::A(const A&)拷貝構造函數。

還要注意, B A ,也就是說b可以隱式轉換為A並傳遞到相同的復制構造函數中。

因此, y[1]A一個實例,具有從b復制的m_n值,但其虛函數仍然是A::value 如果您具有構造函數B::B ,則在初始化時(而不是在返回時)修改值,您將看到預期的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM