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

C++ C++;默认、复制和升级构造函数,c++,inheritance,constructor,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"

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

#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;
    }
我很难理解这个输出,特别是为什么只调用一次基本默认值,而调用最后3个副本。有人能解释一下这个输出吗


谢谢。

基本默认构造函数从第行调用一次

cont.push_back(B(1));  
所有
B
构造函数都调用默认的
A
构造函数。最后两个复制构造函数是由于向量重新分配。例如,如果您添加了

cont.reserve(3);
推回之前,他们会离开


在这之前的一个是临时
a(2)
的副本,在最后的
push\u back

中,基本默认构造函数从行调用一次

cont.push_back(B(1));  
所有
B
构造函数都调用默认的
A
构造函数。最后两个复制构造函数是由于向量重新分配。例如,如果您添加了

cont.reserve(3);
推回之前,他们会离开


在此之前的一个是最后一个
push_back

中临时
a(2)
的副本,此外还有一个足够大的向量,因此它不会调整大小;另请注意:如果在启用优化的情况下编译,那么当编译器优化它们时,两个复制构造函数将消失。为什么a(2)push_back的顺序是:base copy ctor base promotion ctor,base copy ctor,而a(1)push_back的顺序是:base promotion ctor,除了有一个足够大的向量,使其不调整大小之外,还有一个基本副本;另请注意:如果在启用优化的情况下编译,那么当编译器优化它们时,两个复制构造函数将消失。为什么a(2)push_back的顺序是:base copy ctor base promotion ctor,base copy ctor,而a(1)push_back的顺序是:base promotion ctor,请回复评论或提出新问题。这是一个新问题,不是吗?是的,编辑是一个单独的问题;我确实试过reserve()。它们有确切的顺序-请回复评论或提出新问题。这是一个新问题,不是吗?是的,编辑是一个单独的问题;我确实试过reserve()。它们有确切的顺序-