以基实例作为参数的派生类的构造函数
我有这样的代码:
#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)
?我如何告诉编译器这样做?
I have this code:
#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;
}
Why the line B b2 = b1
does not call the constructor B::B(const A &a)
and instead calls A::A(const A &a)
? How can I tell the compiler to do so?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
因为它调用 B::B(const B &a),而 B::B(const B &a) 又调用 A::A(const A &a)。并且您在班级中错过了 B::B(const B &a),因此您看不到它。
Because it calls B::B(const B &a) which in turn calls A::A(const A &a). And you missed B::B(const B &a) in your class so you can't see it.
那是因为:
This:
不是复制构造函数!
然而, this:
是一个复制构造函数。
使用您的复制构造函数版本,您也会破坏堆栈。
为了向您证明我关于堆栈损坏的观点,您必须尝试以下操作:
That is because:
This:
is not a copy constructor!
However, this:
is a copy constructor.
With your version of copy constructor, you are ruining stack as well.
To prove you my point about stack corruption, you have got to try this: