gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:58:13 25 4
gpt4 key购买 nike

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

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
}

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

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

关于C++:派生类隐式调用显式构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24272053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com