2010-07-06 30 views
0

派生類的我有這樣的代碼:構造與基本實例作爲參數

#include <stdio.h> 

class A 
{ 
public: 
    A() { printf("A::A()\n"); } 
    A(const A &a) { printf("A::A(A &a)\n"); } 
    A &operator=(const A &a) { printf("A::operator=\n"); } 
}; 

class B : public A 
{ 
public: 
    B() { printf("B:B()\n"); } 
    B(const A &a) : A(a) { printf("B::B(A &a)\n"); } 
    B &operator=(const B &b) { printf("B::operator=\n"); } 
}; 

int 
main(int argc, char *argv[]) 
{ 
    printf(">> B b1\n"); 
    B b1; 
    printf(">> b2 = b1\n"); 
    B b2 = b1; 
    return 0; 
} 

爲什麼行B b2 = b1不會調用構造函數B::B(const A &a),而是調用A::A(const A &a)?我如何告訴編譯器這樣做?

+0

是否有錯字,或者我錯過了什麼?你明確地編寫了一個B :: operator =,它肯定會在b2 = b1期間被調用,但是它沒有實際的賦值。 – 2010-07-06 16:28:54

+0

它永遠不會被調用,這就是爲什麼它沒有代碼。 – Leandro 2010-07-06 18:32:16

回答

5

因爲它調用B :: B(const B & a),而B :: B又調用A :: A(const A & a)。而且你在班上錯過了B :: B(const B & a),所以你看不到它。

+0

就是這樣,謝謝! – Leandro 2010-07-06 18:31:53

0

這是因爲:

此:

B(const A &a) 
{ 
    printf("B::B(A &a)\n"); 
} 

不是一個拷貝構造函數!

然而,這樣的:

B(const B &a) 
{ 
    printf("B::B(A &a)\n"); 
} 

是拷貝構造函數。

隨着你的版本的複製構造函數,你也毀了堆棧。

爲了證明你對我的堆棧破壞點,你得試試這個:

注意,它永遠不會打印 「內部B ::打印()」

class A 
{ 
public: 
    A() { printf("A::A()\n"); } 
    A(const A &a) 
    { 
     printf("A::A(A &a)\n"); 
    } 
    A &operator=(const A &a) { printf("A::operator=\n"); } 
    void print(){printf("Inside A::Print()\n"); } 
}; 

class B : public A 
{ 
public: 
    B() { printf("B:B()\n"); } 
    B(const A &a) 
    { 
     printf("B::B(A &a)\n"); 
    } 
    B &operator=(const B &b) { printf("B::operator=\n"); } 

    void print(){printf("Inside B::Print()\n");} 
}; 

int main(int argc, char *argv[]) 
{ 
    printf(">> B b1\n"); 
    B b1; 
    b1.print(); 
    printf(">> b2 = b1\n"); 
    B b2 = b1; 
    b2.print(); 
    return 0; 
} 
+0

另外通過查看你的初始化列表: B(const A&a):A(a) 我覺得它最可能是它的一個錯字,我想你的意思是: B(const B&a):A ) – bits 2010-07-06 18:13:53

+0

儘管我編譯並運行了您的示例,但兩行都是打印出來的。 B :: B(const A&a)並不意味着是一個拷貝構造函數,而是一種從A中的任何派生類構造B的方法,僅使用公共數據。你爲什麼說會有堆棧損壞? – Leandro 2010-07-06 18:45:15

+0

是的,你是對的。我想我一定是錯誤的堆棧腐敗。我之前說過,因爲我處於調試模式,可能是因爲A的複製構造函數被隱式調用,所以我的調試將在此時停止。 後來我運行它沒有調試它,它打印print()funcs。 – bits 2010-07-06 22:27:30