2015-06-14 205 views
1

我試圖做一些練習,當我終於想到我明白了,它來了一個練習,它毀了一切。 比如我有以下類:虛擬函數C++

class A 
{ 
public: 
    A() {std::cout<<"A()";} 
    virtual ~A(){std::cout<<"~A()";} 

    virtual void print() {std::cout<<"A";} 
}; 

class B : public A 
{ 
public: 
    B() {std::cout<<"B()";} 
    virtual ~B(){std::cout<<"~B()";} 

    virtual void print() {std::cout<<"B";} 
}; 

而下面的代碼片段:

void f3() 
{ 
    A a[2]; 
    a[1]=B(); 
    a[1].print(); 
} 

而結果我認爲它:

A() A() 
A() B() {not sure why there is an A() too) 
A - and here I really don't know because either A and B are virtual(and I have in the notebook A) 
~B() ~A() 
~A() ~A() 

而另一代碼片段:

void f4() 
{ 
    A* a[]={new A(), new B()}; 
    a[0]->print(); 
    a[1]->print(); 
    delete a[0]; 
    delete a[1]; 
} 

這也是一個問題。我們有

A() {here I don t know why there is an A()} 
A() B() 
A 
B 
~B() ~A() 
A() 

但它是正確的?爲什麼在這裏我們有A和B,而不是B和A?我的意思是,在第一個練習中,我有A,當它是B()類型時,這裏是我認爲它是正常的,但爲什麼?

+2

y u no'A()。print(); B()。print();' – rightfold

+0

爲了讓我們更容易理解什麼時候會發生什麼,爲什麼我只想點擊這裏的編譯器:http://ideone.com/SWiNmn在那裏您可以看到哪一行觸發了哪條語句。 – Michael

+0

謝謝。你幫了我很多。 – Boolean

回答

2
A() A() 

您創建了兩個A的數組,所以兩個A ctor調用。

A() B() {not sure why there is an A() too) 

您創建了一個B(B())和B被從作爲推導,這樣的步驟是:內存分配存儲B,A的爲A部分構造函數的調用,B的構造函數的呼籲B部分。

A - and here I really don't know because either A and B are virtual(and I have in the notebook A) 

您分配了創建新的B到一個A,所以這導致B到目的地A的A部的副本然後你在一個名爲print,這個打印A

~B() ~A() 
~A() ~A() 

dtors被稱爲與ctors完全相反。

在第二次嘗試中,您使用指針和動態分配,在這種情況下使用多態。您的陣列是兩個指針的數組A型,用(地址)兩個對象初始化:第一開始的A,第二個B.

當調用a[0]->print()a[0]是A的地址,所以調用它的方法print

當你調用a[1]->print()a[1]是B的地址,因此該方法的它print叫,因爲printvirtual

+1

我想最後兩個例子是指最後一個例子中的指針大小寫,然後分別是[0] - > print()和[1] - > print()。 – Michael

+0

感謝您的解釋:)我終於明白這是如何工作的。 – Boolean