派生类的c ++向量只调用一次构造函数

Ala*_*ing 2 c++ inheritance constructor stl vector

如果我创建派生类的大小2 std::vector,则只调用一次构造函数.如果我创建基类的大小为2的向量,则构造函数被调用两次.

我通常不会发布复制问题的完整代码,但在这种情况下,它可以很短:

#include <iostream>
#include <vector>

class Base {
public:
    Base() { std::cout << "base constructor" << std::endl; }
    virtual ~Base() {}
};

class Derived : public Base {
public:
    Derived() { std::cout << "derived constructor" << std::endl; }
};

int main() {
    std::vector<Base> base(2);
    std::cout << "----------------" << std::endl;
    std::vector<Derived> derived(2);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的输出对我来说是:

base constructor
----------------
base constructor
derived constructor
Run Code Online (Sandbox Code Playgroud)

为什么输出不是以下内容:

base constructor
base constructor
----------------
derived constructor
derived constructor
Run Code Online (Sandbox Code Playgroud)

我在Linux上使用gcc 4.5.2.

Ker*_* SB 6

你在欺骗自己:派生对象的一个​​默认构造调用两个构造函数.

现在,您没有看到的是复制构造函数,实际上在两种情况下都会调用两次.

的构造函数vector,你打电话让一个其值类型的默认构造,然后拷贝到这一点每一个元素:

//std::vector<Derived> v(2);

std::vector<Derived> v(2, Derived()); // same thing!
Run Code Online (Sandbox Code Playgroud)

  • @Lex:不是!! 将测试用例分成两个程序,你会看到!它是`Derived()`的构造,它调用一个base和一个派生构造函数. (3认同)
  • @Lex:不,不,复制构造函数用于填充向量.将单个默认构造对象作为原型,然后从中复制所有向量元素.只有`Derived :: Derived(const Derived&)`才能用于复制. (2认同)