为什么使构造函数显式显示并不能阻止派生类隐式调用它?
class A{
public:
explicit A(){}
};
class B : public A{
public:
B(){ //Constructor A() is called implicitly
//...
}
}
我在程序中遇到了这种情况,当时我宁愿遇到编译器错误,也可以节省很多时间来查找错误。现在,我将A的默认构造函数更改为接受一个虚拟的“ int”参数来实现这一点,但是“ explicit”关键字是否不应该这样做?
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;
};
由于最多有一个隐式转换可以解决歧义,因此如果您有
void DoBar (Foo foo)
{
int i = foo.GetFoo();
}
以下是合法的:
int main ()
{
DoBar (42); // Implicit conversion
}
这正是显式关键字起作用的地方:禁止上述情况。
为了解决你的问题,为了防止被用作一个基类类,只是标记与构造最后,如果你正在使用C ++ 11(http://en.wikipedia.org/wiki/C++ 11#Explicit_overrides_and_final)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句