C++:显式构造函数由派生类隐式调用

iga*_*gis 3 c++

为什么使构造函数显式不会阻止它被派生类隐式调用?

class A{
public:
    explicit A(){}
};

class B : public A{
public:
    B(){ //Constructor A() is called implicitly

        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的程序中遇到编译器错误时,我遇到了这种情况,这样可以省去很多时间来查找错误.现在我改变了A的默认构造函数来接受一个虚拟的"int"参数来实现它,但不应该"显式"关键字为此工作?

g ++ - 4.8编译上面的代码,没有任何错误或警告.

Mar*_* A. 8

您对explicit关键字的假设是错误的.

explicit关键字不是为了防止从派生类调用构造函数,而是为了防止隐式转换,如下例中的隐式转换:https://stackoverflow.com/a/121163/1938163

我在这里总结相关部分:

class Foo
{
public:
  // single parameter constructor, can be used as an implicit conversion
  Foo (int foo) : m_foo (foo) 
  {
  }

  int GetFoo () { return m_foo; }

private:
  int m_foo;
};
Run Code Online (Sandbox Code Playgroud)

因为最多可以进行一次隐式转换来解决歧义,如果你有一个类似的函数

void DoBar (Foo foo)
{
  int i = foo.GetFoo();
}
Run Code Online (Sandbox Code Playgroud)

以下是合法的:

int main ()
{
  DoBar (42); // Implicit conversion
}
Run Code Online (Sandbox Code Playgroud)

这正是显式关键字发挥作用的地方:禁止上述情况.

要解决您的问题,为了防止您的类被用作基类,如果您正在使用C++ 11,请使用final标记构造函数(http://en.wikipedia.org/wiki/C++ 11#Explicit_overrides_and_final)