虚函数与纯虚函数
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
一个基类的指针时,就会无法调用到派生类的析构函数,就可能出现问题。
而如果析构函数是虚函数,我们也一般不会把它定义为纯虚函数,因为和其它函数不同,编译器要求析构函数必须要有定义(而纯虚函数可以没有函数定义/函数体),这样销毁对象时才能有东西调用。如果非要定义为纯虚函数,那么需要给它提供函数定义。