以基实例作为参数的派生类的构造函数

发布于 2024-09-08 12:25:49 字数 706 浏览 8 评论 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)?我如何告诉编译器这样做?

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

欲拥i 2024-09-15 12:25:49

因为它调用 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.

无悔心 2024-09-15 12:25:49

那是因为:

This:

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

不是复制构造函数!

然而, this:

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

是一个复制构造函数。

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

为了向您证明我关于堆栈损坏的观点,您必须尝试以下操作:

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

That is because:

This:

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

is not a copy constructor!

However, this:

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

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:

Notice that it will never print
"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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文