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)ですか? コンパイラにそうするように指示するにはどうすればよいですか?

4

2 に答える 2

5

これは、B :: B(const B&a)を呼び出し、次にA :: A(const A&a)を呼び出すためです。そして、あなたはクラスでB :: B(const B&a)を逃したので、それを見ることができません。

于 2010-07-06T16:05:51.830 に答える
0

それは理由です:

これ:

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

コピーコンストラクタではありません!

ただし、これは次のとおりです。

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

コピーコンストラクタです。

コピーコンストラクターのバージョンでは、スタックも台無しになっています。

スタックの破損についての私の主張を証明するために、これを試してみる必要があります。

「InsideB::Print()」は出力されないことに注意してください

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;
}
于 2010-07-06T18:11:23.013 に答える