class parent {
    virtual ~parent();
private:
    int father_private;
    int common;
}

~parent() {
    common = 1;
}

class child: public parent {
    ~child();
private:
    int common;
}

~child() {
    common = 2;
}


根据上述逻辑,可以预期执行以下步骤:


〜child()被称为=> child's common = 2。
〜parent()被称为=>父母的共同点= 1?


在步骤2中,“这个共同点=孩子的共同点”吗?

我发现地址不相同,因此可能意味着编译器不使用名称而是使用类中的offeset。因此,步骤2的分配可能会将1写入未知地址,并导致意外崩溃,对吗?

我发现Andorid本机流具有一些类,这些类的构造函数或析构函数可以访问其私有数据成员。作为上述问题,这使得继承极其困难。您如何解决这个问题?

最佳答案

这段代码:

class child: public parent {
    ...
    int common;
}


在类int中定义一个名为common的独特child。因为基类有任何名为common的符号,所以该基符号被简单地隐藏了。

基本符号parent::commonint还是std::string或函数名称还是枚举都没有关系。它是隐藏的。


  在第2步中,“这个共同点=孩子的共同点”吗?


否。在parent函数中,它是父级的common


  因此,步骤2的分配可能会将1写入一个未知地址,并导致意外崩溃,对吗?


否。一项作业分配给parent::common。另一个分配给child::common。它们是两个不同的变量。

关于c++ - 如何避免父类析构函数设置派生类的数据成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28102099/

10-11 23:02
查看更多