当运算符在方法旁边时,运算符'~'做什么,纯虚拟方法的用途是什么?
What does the operator '~' do when it is beside a method and what is a pure virtual method for?
示例代码:
#include <string>
namespace vehicle
{
class Vehicle
{
public:
Vehicle(int a);
virtual ~Vehicle(); <------ not method?
protected:
int a;
};
}
另外,我不完全理解纯虚拟方法的概念,您将方法声明为:
virtual method() = 0;
我们为什么需要这个?
假设有两个类:Base
和Derived
struct Base
{
Base() {}
virtual void foo() = 0;
virtual ~Base()
{
std::cout << "Base descructor" << std::endl;
}
};
struct Derived : Base
{
int *i;
Derived(int i_): Base(), i(new int[i_]) {}
virtual void foo() override
{
std::cout << "foo" << std::endl;
}
virtual ~Derived()
{
std::cout << "Derived descructor" << std::endl;
delete [] i;
}
};
纯虚函数
如果Derived
不重写foo
函数,则可以创建Derived
类的实例。当你尝试时,你的代码将无法编译,因为foo
是一个纯虚函数。
错误:抽象类类型"派生"的新表达式无效
注意:因为以下虚函数在"派生"中是纯的:
struct Derived : Base
纯虚函数用于描述接口。
现在关于虚拟析构函数:
~
(tilda) 符号用于表示类析构函数。它 是在销毁对象时调用的特殊方法。
客户端创建派生的实例:
Base *instance = new Derived;
然后以某种方式使用此变量,当您不需要该变量时,您需要释放内存:
delete instance;
让我们跟踪调用:
衍生脱壳器
底座除尘器
因此,您可以看到调用了基本析构函数和派生析构函数,并且不存在内存泄漏。但是,如果您从析构函数中删除此virtual
关键字
底座除尘器
如您所见,没有调用 Derived 的 descturtor,因此存在内存泄漏(Derived 类的数组不会被释放)。
因此,当您通过指针处理对象时,虚拟构造函数很有用。
虚拟 ~车辆();
波浪号~
表示析构函数。这是一种方法,一种销毁物体的特殊方法。
虚拟析构函数用于抽象基类。
虚拟方法() = 0;
这是纯粹的虚函数。它指示您必须为实现此抽象基类的实现类提供实现method
。
相关文章:
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 使用类型id运算符的最佳替代方法
- C++运算符 - 方法
- "operator()"在重载运算符方法中是什么意思,在priority_queue(STL)中用作C++中的比较器?
- 一种优雅或至少可行的方法,用于使用和接受具有重载方法和运算符的不同大小的文字数组常量
- 类方法的C++插入运算符
- 将方法委托给成员的重写运算符>
- 矢量擦除方法是否需要类才能具有 = 运算符?
- 使用新运算符C++创建多维数组的简单方法
- std::is_invocable 用于测试任意方法是否存在的语法(不仅是运算符())
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- 使用运算符和类后方法名称
- 让类与运算符一起工作更简单的方法
- 运算符重载C++、(+、-、*、/ 等)有没有比复制、替换和粘贴更聪明的方法?
- std::map 索引运算符与插入方法的性能
- 使用范围解析运算符时,在构造函数中调用虚拟方法是否安全?
- 使用类中的方法作为运算符将值分配给类的私有成员
- 基方法/运算符在派生 (C++) 上调用时返回基类型
- 具有继承的重载方法/运算符不起作用