在派生类中将公共父析构函数设为私有
Making public parent destructor private in derived class
当我尝试编译以下代码时:
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
相关文章:
- 使用基类指针创建对象时,缺少派生类析构函数
- 添加自定义析构函数时,Move 构造函数在派生类中消失
- 从 c++ 中派生类的析构函数调用虚函数
- 如何从 Gtk::窗口调用派生对象的析构函数
- 在派生类中将公共父析构函数设为私有
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- C++11:我可以显式调用基类析构函数来销毁派生类吗
- 在从仅移动类型派生的类中定义析构函数在使用 std::vector emplace_back或push_back创建时会
- 受保护的析构函数禁用在堆栈上创建派生类的对象?
- 防止派生析构函数中的 vtable 数据争用
- 如何在另一个类的向量中调用派生类的析构函数
- 了解派生类中C++析构函数的行为
- 私有派生析构函数
- 在派生类中重写哪个基类的虚拟析构函数
- 基类没有析构函数,但派生类有析构函数。我是否需要寻找与堆无关的任何陷阱?
- 显式声明派生类中所需的析构函数
- 调用派生类的析构函数
- 在这种情况下,我的派生类是否还需要一个虚拟析构函数
- g++对基类析构函数和派生类指针的未定义引用
- 通过 BaseClass List 调用派生类对象的析构函数