c++中的继承,内部输出
Inheritance in c++, output inside
我有这样的代码:细节在..之后。。
#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的复制构造函数
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 将函数类成员映射到类本身内部
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- c++运算符=工作异常(函数内部输出正常,但返回后错误)
- 当在函数内部使用静态变量时,输出会发生变化,该函数在c++中返回引用
- c++中的继承,内部输出
- 我应该释放内部分配的MFT输出缓冲区的返回IMFSample吗
- 从Qt内部运行c++二进制文件,并将二进制文件的输出重定向到Qt应用程序上的文本框