虚拟析构函数声明之后的覆盖标识符是否有特殊含义? class Base { public: virtual ~Base() {} virtual int Method() const {} }; class Derived : public Base { public: virtual ~Derived() override {} virtual int Method() override // error: marked override, but does not override – missing const {} }; 在虚拟方法上使用覆盖标识符是有用的,因为检查:当基本虚拟方法实际上没有被覆盖时,编译器将报告错误。 在虚拟析构函数上的重写是否也有任何意义/function?
可能重复: 何时使用虚拟析构函数? 什么时候你的C ++对象的析构函数是virtual ?
Java和C#支持不能用作具有final sealed关键字的基类的类的概念。 然而,在C ++中,没有什么好方法可以防止从类派生出类,如果每个类都有一个虚拟析构函数,那么这个类的作者就会左右为难。 编辑:由于C ++ 11这不再是真实的,你可以指定一个类是final 。 一方面给一个对象一个虚拟的析构函数意味着它将有一个vtable ,因此每个对象为vptr消耗4个(或64位机器上的8个)附加字节。 另一方面,如果稍后有人从这个类派生出来并通过一个指向基类的指针删除一个派生类,那么程序将会是不明确的(由于没有虚拟析构函数),并且坦率地说,对每个对象的指针进行优化是荒谬。 在具有虚拟析构函数的抓手上(可以说)宣称这种types意图被多态使用。 有些人认为你需要一个明确的理由不使用虚拟析构函数(就像这个问题的潜台词),而另外一些人则说,只有当你有理由相信你的类是派生出来的时候,你才应该使用它们, 你认为?
这个问题不同于“ 何时/为什么我应该使用virtual析构函数? ”。 struct B { virtual void foo (); ~B() {} // <— not virtual }; struct D : B { virtual void foo (); ~D() {} }; B *p = new D; delete p; // D::~D() is not called 问题 : 这可以被归类为一个未定义的行为(我们知道~D()不会被肯定的调用)? 如果~D()是空的。 它会以任何方式影响代码? 用B* p;使用new[] / delete[] B* p; , ~D()肯定不会被调用,而不pipe析构函数的virtual性如何。 这是一个未定义的行为或明确的行为?
我对大多数面向对象理论有一个很好的理解,但是让我困惑的是虚拟析构函数。 我认为无论对于链中的每个对象,析构函数总是被调用。 你什么时候想让他们变成虚拟的,为什么?