在派生类初始化列表中初始化基类成员

时间:2013-04-19 11:24:59

标签: c++ oop

我有一堂课,我必须实例化很多次。它是这样的:

class A
{
  public:

  A() : a1(0.0f), a2(-1) {}

  float a1;
  int   a2;
};

class B : public A
{
  B();
  float b;
};

我想到了实现B的ctor的两种方法:

B(): A(), b(0.0f) {} // Using the base class ctor.

B(): b(0.0f) { a1 = 0.0f; a2 = -1; } // Not using the base class ctor. Ugly but maybe faster?

哪一个更快?

我的成员类型在基类和继承类中都是基本的(int,float,double ...)。

编译器:Intel和LLVM。

2 个答案:

答案 0 :(得分:2)

第一种方式是你唯一的选择。您的第二个“选项”将无效,因为a1a2在基类中声明,因此无法在B的初始化列表中初始化。

原因是它们属于A,因此初始化它们是A的责任,并且将在A的构造函数中完成,这是在任何其他初始化发生之前在B。无论你做什么,总会有A的构造函数被称为构造B对象的第一步。即使你以某种方式可以避免这种情况并直接从B初始化成员,也没有理由期望实际的性能提升。

答案 1 :(得分:0)

您无法在派生类的初始化列表中初始化基类的成员。第二个不会编译。

你必须选择调用A个构造函数中的哪一个;如果您提及none,则会自动调用默认的A()。没有办法不调用基类构造函数。