【发布时间】:2017-12-20 15:07:46
【问题描述】:
在我正在处理的项目中,我很难理解隐式构造函数调用。
有两个接口:接口A和接口B。
然后,有两个实现类:ImplementA和ImplementB,它们是从各自的接口派生的。任何时候都没有共同的祖先——即使接口和类非常相似。
第三个类 Component 可用于初始化任何 Implement 类。
所以我们有这样的东西:
class InterfaceA
{
public:
InterfaceA(){}
virtual ~InterfaceA(){}
// Some functions
}
class InterfaceB
{
public:
InterfaceB(){}
virtual ~InterfaceB(){}
// Some functions
}
class ImplementA : public InterfaceA
{
public:
ImplementA(Component& input);
ImplementA(Component* input);
ImplementA(const ImplementA& impl);
ImplementA(const ImplementB& impl);
ImplementA();
~ImplementA(void);
private:
Component* m_component;
bool some_boolean;
}
class ImplementB : public InterfaceB
{
public:
ImplementB(Component& input);
ImplementB(const ImplementA& impl);
ImplementB(const ImplementB& impl);
ImplementB();
~ImplementB(void);
private:
Component* m_component;
}
然后,我们有一个函数返回一个指向组件的指针:
Component* foo()
{
Component* result = new Component();
...
return result;
}
最后,在代码的某处,我们得到以下返回:
return new ImplementB(foo());
运行时,上面的行执行 foo(),然后执行 ImplementA(Component* input),然后执行 ImplementB(const ImplementA& impl) - 这让我非常困惑。
1. 为什么它甚至可以编译?编译器不应该抱怨这种类型的参数没有有效的构造函数(当我在相关调用中更改某些内容时它会这样做)。顺便说一句,我正在使用 Visual Studio 2012。
2.我知道当构造函数获取一个指向对象的指针作为参数时,它首先调用参数的复制构造函数。所以,如果我忽略了没有合适的构造函数的事实 - 它不应该使用 Component 的复制构造函数而不是 ImplementA 吗? ImplementA 似乎与 ImplementB 完全没有联系(除了它们具有相似的结构)。
我错过了什么?在这种情况下,什么可能导致这种行为?
【问题讨论】:
-
也许你应该让你的构造函数
explicit这样就不允许像这样的隐式转换?
标签: c++ oop visual-studio-2012 copy-constructor