虚函数和动态联编

关于虚函数

(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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值