在派生类中将公共父析构函数设为私有

Making public parent destructor private in derived class

本文关键字:析构函数 派生      更新时间:2023-10-16

当我尝试编译以下代码时:

class A {
public:
A();
~A();
};
class B : A {
private:
using A::A;
using A::~A;
};

我收到以下编译器错误消息:

error: 'A::~A' names destructor

为什么会这样?

我想这样做的更大原因是能够使用模板创建一个容器,理论上可以通过容器<容器>(也定义 Node 类(实例化来存储任何类型的容器,但希望通过创建一个名为 C_Node 的容器的派生版本来减少用户的困惑,该版本具有除 Node 类私有之外的所有内容。最终目标是允许用户> C 声明容器

如果有更好的方法可以在C++做到这一点,请让我听到。

这不是一个存在的功能,也没有真正的意义。

using A::A不继承基构造函数。它合成该位置的B(A's args),并使用该访问级别将其参数转发给基本 ctor。

析构函数没有参数,因此不存在此功能。可以添加吗?确定。但没有真正的理由这样做。

你可以简单地编写~B() = default;来获得你所追求的效果,但我强烈建议不要将析构函数设为私有。

在几乎所有情况下,您都不应该将析构函数设为私有。析构函数必须是公共的,以便编译器可以在对象达到其生存期结束时调用它。也没有理由尝试"隐藏"基类的析构函数。

没有人应该显式调用析构函数,除非在非常低级别的代码中,例如使用原始联合的代码。

你看过std::any课吗?std::any是一个可以存储任何类型的类,我认为它可以完成您正在尝试做的事情:

// main.cpp
#include <any>
#include <iostream>
#include <string>
int main() {
using std::any;
using std::string; 
any x = 10;
// x can be assigned any type
x = string("hello");
// You can get the type x contains safely using any_cast
std::cout << std::any_cast<string>(x) << 'n';
}

std::any在 2017 年发布的 C++17 中被添加到该语言中。您可以通过在 gcc 或 clang 上添加编译标志-std=c++17来使用它!

$ g++ -std=c++17 main.cpp -o main