30得票3回答
我需要在子类的方法上也指定虚拟吗?

这个问题可能在SO上已经被问过,但我找不到类似的问题。 考虑以下类层次结构:class BritneySpears { public: virtual ~BritneySpears(); }; class Daughter1 : public BritneySpears { ...

28得票5回答
C++:继承自std::map

我想继承std::map,但据我所知std::map没有任何虚析构函数。 那么,在我的析构函数中显式调用std::map的析构函数是否可行,以确保正确的对象销毁?

25得票4回答
C++中的虚默认析构函数

我有一组大量的继承类(criteria),它们都继承自一个基类(criterion)。这是criterion的代码:class criterion { public: virtual unsigned __int32 getPriorityClass() const = 0; ...

24得票5回答
缺少vtable通常意味着第一个非内联虚拟成员函数没有定义。

我非常确定这个问题是重复的,但我的代码不同,以下是我的代码。它遇到了一个“未定义符号”的错误,不确定缺少什么。class Parent { public : virtual int func () = 0; virtual ~Parent(); }; cla...

23得票4回答
C++接口是否必须遵守五个规则?

在定义接口类时,声明实例化方法的正确方式是什么? 显而易见,抽象基类需要具有虚析构函数。但是,接下来会出现以下编译警告:“‘InterfaceClass’定义了一个非默认析构函数,但没有定义复制构造函数、复制赋值运算符、移动构造函数或移动赋值运算符”,这就是‘五法则’。 我理解为什么通常应...

23得票1回答
Valgrind显示std::make_unique存在内存泄漏问题

我正在使用Valgrind检查内存泄漏。不幸的是,我得到了一个Leak_DefinitelyLost警告。 以下是一个简化版本的代码,可以重现这个错误:#include <iostream> #include <vector> #include <memory&g...

23得票4回答
类拥有虚函数和可访问的非虚析构函数

我有两个类:class A { public: virtual void somefunction() = 0; }; class B : public A { public: B(); ~B(); void somefunction(); }; B::B(...

22得票6回答
虚析构函数:在非动态分配内存时是否需要?

如果我的类没有动态分配任何内存,那么我们需要虚析构函数吗? 例如:class A { private: int a; int b; public: A(); ~A(); }; class B: public A {...

21得票5回答
使用非虚拟析构函数有什么特定的原因吗?

据我所知,任何被指定为有子类的类都应该声明为虚析构函数,这样当通过指针访问它们时,类实例可以被正确地销毁。 但是为什么可以声明非虚析构函数的类呢?我相信编译器可以决定何时使用虚析构函数。那么,这是C++设计上的疏忽还是我漏掉了什么?

21得票7回答
如果我将一个基类的析构函数从非虚拟改为虚拟,会发生什么?

我发现一个基类的析构函数是非虚拟的,尽管该基类有1个虚拟函数fv()。这个基类还有许多子类,其中许多子类定义了自己的fv()。 我不知道程序中如何使用基类和子类的细节。我只知道即使基类的析构函数应该是虚拟的,程序也可以正常工作。 我想将基类的析构函数从非虚拟改为虚拟的。但是我不确定后果。那...