关于虚函数
(1)编译器对虚方法(virtual
修饰的方法)使用动态联编,如下:
Dog dog;
Animal* pAnimal;
pAnimal = &dog;
pAnimal->eat();
假如eat()
方法是虚方法,则调用的是子类的eat()
方法(动态联编,可以理解为基类的eat()
方法是虚设的);
否则(不使用virtual
修饰的方法),调用的是基类的eat()
方法(静态联编)
(2)默认情况下为静态联编,因为它的效率比动态联编效率高
(3)如果要在派生类中重新定义基类的方法,则将它设置为虚方法;否则,设置为非虚方法
(4)析构函数应当是虚函数,除非类不用做基类
代码
// test01.h
#ifndef TEST01_H_
#define TEST01_H_
class Animal {
private:
int a;
public:
virtual void eat(); // 虚函数与动态联编
};
#endif
//===============================================================
//test01.cpp
#include"test01.h"
#include<iostream>
void Animal::eat()
{
std::cout << "Animal" << std::endl;
}
//===============================================================
// test02.h
#ifndef TEST02_H_
#define TEST02_H_
#include"test01.h"
class Dog : public Animal {
public:
void eat();
};
#endif
//===============================================================
// test02.cpp
#include"test02.h"
#include<iostream>
void Dog::eat()
{
std::cout << "Dog" << std::endl;
}
//===============================================================
//main.cpp
#include<iostream>
#include"test01.h"
#include"test02.h"
int main() {
Dog dog;
Animal* pAnimal;
pAnimal = &dog;
pAnimal->eat();
std::cin.get();
return 0;
}
//===============================================================
>>>> Dog