虚函数的使用

基类:

 

class Base
{
public:
	 void add();
	 ~Base();
};


Base::~Base()
{
	std::cout << "father is dying...\n";
}

void Base::add()
{
	std::cout << "I am father!" << std::endl;
}

 

 

 

派生类:

 

class derive :public Base
{
public:
	~derive();
	void add();//与基类同名的函数
};

derive::~derive()
{
	std::cout << "son is dying...\n";
}

void derive::add()
{
	std::cout << "I am son!" << std::endl;
}

 

 

测试代码:

int _tmain(int argc, _TCHAR* argv[])
{
	
	Base b1;
	derive b2;

	Base& a1 = b1;
	Base& a2 = b2;

	Base* a3 = &b1;
	Base* a4 = &b2;


	a1.add();
	a2.add();

	a3->add();
	a4->add();
	
	system("pause");
	return 0;
}

 


运行后结果:
I am father!
I am father!
I am father!
I am father!

由此可见,基类的引用或者指针,不论指向派生类还是基类,都只会调用基类的函数。
如果将基类的add()改成虚函数:

 

 

 

 

class Base
{
public:
	 virtual void add();
	 ~Base();
};


结果:
I am father!
I am son!
I am father!
I am son!

由此可见,在基类中,将可能重新定义的函数定为虚函数,之后会根据指针或引用指向的对象类型调用相应函数。这就是多态公有继承。

 

 

 

 

 

 

 

 

 

 

 

 

 

虚析构函数:

非虚析构函数情况下测试程序:

 

 

int _tmain(int argc, _TCHAR* argv[])
{
	Base* b1 = new derive;
	b1->add();
	delete b1;
	
	system("pause");
	return 0;
}

结果:
I am son!
father is dying...

由此可见,虽然删除的是派生类对象,但它调用的是基类的析构函数!
为了避免这种情况,在基类的析构函数前加上virtual:

 

 

class Base
{
public:
	virtual void add();
	virtual ~Base();
};

 

 

 

结果:
I am son!
son is dying...
father is dying...



由此可见,析构时,先调用了派生类的析构函数,然后调用了基类的析构函数。一般情况下,基类默认使用虚析构函数。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值