我有这段代码:
#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 :(得分: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;
}