为什么使构造函数显式不会阻止它被派生类隐式调用?
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编译上面的代码,没有任何错误或警告.
您对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)