2010-07-06 29 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