C ++默认,复制和升级构造函数

时间:2012-09-16 20:22:23

标签: c++ inheritance constructor

我有以下代码[这是一个面试问题]:

#include <iostream>
#include <vector>

using namespace std;

class A{
public:
    A(){
        cout << endl << "base default";
    }
    A(const A& a){
        cout << endl << "base copy ctor";
    }
    A(int) { 
        cout << endl << "base promotion ctor";
    }
};

class B : public A{
public:
    B(){
         cout << endl << "derived default";
    }
    B(const B& b){
         cout << endl << "derived copy ctor";
    }
    B(int) {
         cout << endl << "derived promotion ctor";
    }
};

int main(){

    vector<A> cont;
    cont.push_back(A(1));
    cont.push_back(B(1));
    cont.push_back(A(2));

        return 0;
    }

输出结果为:

base promotion ctor
base copy ctor
base default
derived promotion ctor
base copy ctor
base copy ctor
base promotion ctor
base copy ctor
base copy ctor
base copy ctor

我无法理解这个输出,特别是为什么一次调用base default和最后一次调用ctor。有人可以解释一下这个输出吗?

感谢。

1 个答案:

答案 0 :(得分:4)

从行

调用基本默认构造函数一次
cont.push_back(B(1));  

所有B构造函数都调用默认的A构造函数。最后两个拷贝构造函数是由于向量重新分配。例如,如果您添加了

cont.reserve(3);

push_back之前,它们会消失。

之前的那个是最终A(2)中临时push_back的副本。