C++编程思想 第1卷 第15章 多态性和虚函数 析构函数和虚拟析构函数 纯虚析构函数

尽管纯虚析构函数在标准C++中是合法的,但在使用时有一个额外的限制:必须
为纯虚析构函数提供一个函数体

纯虚析构函数和非纯虚析构函数之间唯一的不同之处在于纯虚析构函数使得
基类是抽象类,所以不能创建一个基类的对象

//: C15:UnAbstract.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// Pure virtual destructors 
// seem to behave strangely

class AbstractBase {
public:
  virtual ~AbstractBase() = 0;
};

AbstractBase::~AbstractBase() {}

class Derived : public AbstractBase {};
// No overriding of destructor necessary?

int main() { Derived d; } ///:~

一般来说,如果在派生类中基类的纯虚函数没有重新定义,则派生类将会
成为抽象类

当我们的类仅含有一个纯虚函数时,就会发现这个唯一的差别:析构函数

运行下面的程序,可以看到在派生类版本之后,随着任何其他的析构函数,
调用了纯虚函数体

//: C15:PureVirtualDestructors.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// Pure virtual destructors
// require a function body
#include <iostream>
using namespace std;

class Pet {
public:
  virtual ~Pet() = 0;
};

Pet::~Pet() {
  cout << "~Pet()" << endl;
}

class Dog : public Pet {
public:
  ~Dog() {
    cout << "~Dog()" << endl;
  }
};

int main() {
  Pet* p = new Dog; // Upcast
  delete p; // Virtual destructor call
  getchar();
} ///:~

作为一个准则,任何时候我们的类做都要有一个虚函数,我们应当立即增加
一个虚析构函数

输出
~Dog()
~Pet()

猜你喜欢

转载自blog.csdn.net/eyetired/article/details/81353937