虚函数
虚函数是在基类中使用关键字virtual
声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。
纯虚函数
在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是在基类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数。
纯虚函数的声明:
virtual void eat() = 0;
使用虚函数/纯虚函数的意义:
- 实现C++多态性;
- 更好的去抽象一个类;
使用虚函数/纯虚函数的注意事项:
- 包含一个或多个纯虚函数的类称为抽象类,抽象类不能实例化;
- 可以实例化抽象类的指针;
- 纯虚函数没有函数主体;
- 在派生类中要重写纯虚函数;
- 友元函数不能为虚函数;
- 当基类指针指向一个子类对象,通过这个指针调用子类和基类同名成员函数的时候,基类声明为虚函数就会调子类的这个函数,不声明就会调用基类的这个函数;
- 不在析构或者构造过程中调用虚函数;
- 虚析构函数:基类指针指向派生类,在析构派生类时,虚析构函数能正确析构;
- 包含虚函数的类指针列表会增大,因为多包含了一个虚表;
例:
#include <iostream>
class Animal{
public:
Animal() {
std::cout << "animal init" << std::endl;
}
~Animal() {
std::cout << "~animal()" << std::endl;
}
public:
virtual void eat() = 0;
void sleep() {
std::cout << "animal sleep" << std::endl;
}
};
class Dog : public Animal {
public:
Dog(){
std::cout << "Dog init" << std::endl;
}
~Dog(){
std::cout << "~Dog()" << std::endl;
}
public:
void eat() {
std::cout << "Dog eat" << std::endl;
}
void sleep() {
std::cout << "Dog sleep" << std::endl;
}
};
int main(int argc, char* argv[])
{
Dog dog;
Animal *animal;
animal = &dog;
animal->eat();
printf("Hello World!\n");
return 0;
}