以下是实际问题的简化版本。代码似乎不会调用Base::operator=(int)
,而是生成一个临时对象Derived
,并将其复制。为什么不使用基赋值运算符,因为函数签名似乎完全匹配?这个简化的例子不会显示任何不良影响,但原始代码在析构函数中有一个副作用,导致各种破坏。为什么派生类不使用基类操作符=(赋值操作符)?
#include <iostream>
using namespace std;
class Base
{
public:
Base()
{
cout << "Base()\n";
}
Base(int)
{
cout << "Base(int)\n";
}
~Base()
{
cout << "~Base()\n";
}
Base& operator=(int)
{
cout << "Base::operator=(int)\n";
return *this;
}
};
class Derived : public Base
{
public:
Derived()
{
cout << "Derived()\n";
}
explicit Derived(int n) : Base(n)
{
cout << "Derived(int)\n";
}
~Derived()
{
cout << "~Derived()\n";
}
};
class Holder
{
public:
Holder(int n)
{
member = n;
}
Derived member;
};
int main(int argc, char* argv[])
{
cout << "Start\n";
Holder obj(1);
cout << "Finish\n";
return 0;
}
的输出是:
Start
Base()
Derived()
Base(int)
Derived(int)
~Derived()
~Base()
Finish
~Derived()
~Base()
好消息!我假设'operator ='是唯一一个表现出这种行为的人(对构造函数没有意义,也没有任何其他编译器生成的方法)。 –
@LuchianGrigore,我希望如此!这一个引起我们各种头部划伤,我不想再次遇到它。 –
单参数(能)构造函数应该几乎总是自动让你输入'explicit'。 –