虚函数与纯虚函数

2021-02-24  本文已影响0人  devilisdevil

C++的类要实现多态,不像java,直接就有,而是需要给函数前面带上virtual,所以java的成员函数从c++角度来说的话都是虚函数。

再基类指针或引用指向派生类的时候,调用虚函数,就会在运行时判断并采用真实对象的函数实现,而不是基类的。

虚函数

如上面所说的,加上virtual即可,因为不是纯虚函数,所以也同样需要提供函数的定义

纯虚函数

除了同样必须要有virtual关键字外,函数的定义不是必须的,纯虚函数就是在声明时加上=0即可,如过想要带上定义,那只能把定义放到外面。如

class A {
  public:
    virtual void print() = 0;
}

void A::print() {
  cout << 123 << endl;
}

含有纯虚函数的类是属于抽象类,是不能用他们直接创建对象的,如果要在派生类中调用基类的方法,则采用A::print()的形式。

析构函数(虚/纯虚?)

在继承的情况下,对于一个派生类对象的实例,他的正常销毁是需要从派生类的析构函数开始,一直向上调用各级父类的析构函数。

如果类中包含虚函数,那么析构函数最好也声明为虚函数,因为如果不然,在delete一个基类的指针时,就会无法调用到派生类的析构函数,就可能出现问题。

而如果析构函数是虚函数,我们也一般不会把它定义为纯虚函数,因为和其它函数不同,编译器要求析构函数必须要有定义(而纯虚函数可以没有函数定义/函数体),这样销毁对象时才能有东西调用。如果非要定义为纯虚函数,那么需要给它提供函数定义。

上一篇 下一篇

猜你喜欢

热点阅读