基类实例作为参数的派生类的构造方法

时间:2010-07-06 15:25:37

标签: c++ constructor derived-class

我有这段代码:

#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)?我怎么能告诉编译器呢?

2 个答案:

答案 0 :(得分:5)

因为它调用B :: B(const B&amp; a),它又调用A :: A(const A&amp; a)。你在班上错过了B :: B(const B&amp; a),所以你看不到它。

答案 1 :(得分:0)

那是因为:

此:

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

不是复制构造函数!

但是,这个:

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

是一个复制构造函数。

使用您的版本的复制构造函数,您也会破坏堆栈。

为了证明你对堆栈损坏的观点,你必须尝试这个:

  

请注意,它永远不会打印   “Inside B :: 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;
}