我检查了这段代码,我在函数func()的末尾看到了 基类的析构函数已被调用两次。 我不明白为什么? 谢谢..
class base {
public:
base(){cout << "ctor of base\n";}
~base(){cout << "d-ctor of base\n";}
};
class derived: public base
{
public:
derived(){cout << "ctor of derived\n";}
~derived(){cout << "d-ctor of derived\n";}
};
void func(base ob)
{
cout << "inside func\n";
}
void main()
{
derived ob;
func(ob);
system("pause");
}
答案 0 :(得分:4)
重构您的基类,如下所示:
class base {
public:
base(){cout << "ctor of base\n";}
base(const base&) {cout << "copy-ctor of base\n";}
~base(){cout << "d-ctor of base\n";}
};
将发出以下输出:
ctor of base
ctor of derived
copy-ctor of base
inside func
d-ctor of base
d-ctor of derived
d-ctor of base
非常清楚地显示func中的基本变量被复制然后被销毁。
答案 1 :(得分:2)
base
按值传递给func
。
这意味着将创建ob
的切片副本。
这将被销毁以及ob
本身。 ob
(derived::~derived
)的析构函数将自动调用基类析构函数。
因此,base
析构函数被调用两次。
答案 2 :(得分:-1)
调用该函数时,您可以按值获取参数。因此,您在base
中创建了func
类型的局部变量。
当您从func
返回时,本地变量会被销毁,因此会调用ob
的descrutor(类型为base
)。
您必须通过引用或指针传递多态类型。
这称为切片问题。有关详细信息,请参阅this链接。