C++ 基类和派生类c+的析构函数+;
我检查了这段代码,在函数func()的末尾看到了这一点 基类的析构函数已被调用两次。 我不明白为什么?? 谢谢C++ 基类和派生类c+的析构函数+;,c++,inheritance,destructor,C++,Inheritance,Destructor,我检查了这段代码,在函数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 der
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");
}
类基{
公众:
base(){cout当调用函数时,按值获取参数。因此,在func
中创建一个base
类型的局部变量
从func
返回时,局部变量被销毁,因此调用ob
的descrutor(其类型为base
)
您必须通过引用或指针传递多态类型
这就是所谓的切片问题。有关详细信息,请参阅链接。调用函数时,按值获取参数。因此,您在func
中创建了一个类型为base
的局部变量
从func
返回时,局部变量被销毁,因此调用ob
的descrutor(其类型为base
)
您必须通过引用或指针传递多态类型
这称为切片问题。有关详细信息,请参阅链接。base
通过值传递给func
。
这意味着将创建ob
的切片副本
这将与ob
本身一起销毁。ob
(派生::~derived
)的析构函数将自动调用基类析构函数
因此,base
析构函数被调用两次。base
通过值传递给func
。
这意味着将创建ob
的切片副本
这将与ob
本身一起销毁。ob
(派生::~derived
)的析构函数将自动调用基类析构函数
因此,基类
析构函数被调用两次。如下重构基类:
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";}
};
非常清楚地显示func中的基变量被复制,然后被销毁。像这样重构基类:
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";}
};
非常清楚地显示func中的基变量是被复制然后被销毁的。请参见:@Csq是的,它被切片了,但这并不能解释对~base()
的两次调用。当多态性受到威胁时,不要忘了虚拟析构函数。~base()
应该是虚拟~base()
@Angew我已经写了一个更详细的答案。你确定两次破坏都发生在“函数func()
”的末尾,即调用system()
”之前吗?请参见:@Csq是的,它被分割,但这并不能解释对~base()的两次调用
。当多态性受到威胁时,不要忘记虚拟析构函数。这里的~base()
应该是virtual~base()
@Angew我已经写了一个更详细的答案。你确定两个析构函数都发生在“函数func()
”的末尾,即调用system()之前吗
?仍然不能解释第二次调用~base()
;或者这是从哪里来的?@Angew这是个好问题,我知道。仍然不能解释第二次调用~base()
;或者这是从哪里来的?@Angew这是一个好问题,我知道。好的,我用另一个编译器尝试了它,我发现基本d-ctor只调用了一次。这意味着我自己的编译器出了问题。我用另一个编译器尝试了它,我发现基本d-ctor只调用了一次。这意味着我的编译器出了问题这是我自己的编译器