Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基类和派生类c+的析构函数+;_C++_Inheritance_Destructor - Fatal编程技术网

C++ 基类和派生类c+的析构函数+;

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

我检查了这段代码,在函数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");
}
类基{
公众:

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只调用了一次。这意味着我的编译器出了问题这是我自己的编译器