c++中的继承,内部输出

Inheritance in c++, output inside

本文关键字:内部 输出 继承 c++      更新时间:2023-10-16

我有这样的代码:细节在..之后。。

#include <iostream> 
using namespace std;
template <class T>
class A {
public:
    A() { cout << "A::A()" << endl; }
    A(const A& a) :i(a.i) { cout << "A::A(A&)" << endl; }
private:
    T i;
};
template <class T>
class B {
public:
    B(A<T> aa) : a(aa) { cout << "B::B(A)" << endl; }
    B(const B& b) : a(b.a) { cout << "B::B(B&)" << endl; }
    A<T> a;
};
class C : public B<int> {
public:
    C(A<int> aa) : B<int>(aa), a(aa){ cout << "C::C(A aa)" << endl; }
    ~C() { cout << "C::~C()" << endl; }
    A<int> a;
};
void main()
{
    cout << "--1--" << endl;
    A<int> a;
    cout << "--2--" << endl;
    C c(a);
}

输出为:

--1--
A::A()
--2--
A::A(A&)
A::A(A&)
A::A(A&)
B::B(A)
A::A(A&)
C::C(A aa)
C::~C()
Press any key to continue . . .

我的问题是为什么复制类A的构造函数在类B的构造函数之前调用3次??

谢谢大家。

如果你遵循构造函数调用链,那就很清楚了:

  • 一次按值将a的副本传递给C的构造函数
  • 一次按值将其副本传递给B的构造函数
  • 一次复制构建B的成员a

您可以通过更改这些构造函数以引用它们的参数来避免前两种情况,就像A的复制构造函数所做的那样。

首先传递给C(A<int> aa),它是一个副本这将转到作为副本的B(A<T> aa)然后在这里再次复制a(aa)

传递const引用以避免这些副本。

请注意,这些类不需要显式定义的复制构造函数。

C(A aa):B(aa),A(aa)调用

1.B<int>(aa) -- calls B(A<T> aa), call by value, so A::A(const A& a) is called
2. a(aa) -- calls A::A(const A& a)
3. C(A<int> aa) (aa passed by value, so, A::A(const A& a) is called

这就是为什么你有一个被称为3次的类A的复制构造函数