C++虚函数总结

定义如下两个类:

class A
{
public:
	A()
	{
		cout << "基类构造函数" << endl;
	}
	/*virtual*/ ~A()
	{
		cout << "基类析构函数" << endl;
	}
	virtual void func1()
	{
		cout << "基类函数func1" << endl;
	}
	void func2()
	{
		cout << "基类函数func2" << endl;
	}
	void func3()
	{
		this->func1();
	}
};
class B:public A
{
public:
	B()
	{
		cout << "派生类构造函数" << endl;
	}
	~B()
	{
		cout << "派生类析构函数" << endl;
	}

	void func1()
	{
		cout << "派生类函数func1" << endl;
	}
	void func2()
	{
		cout << "派生类函数func2" << endl;
	}
	void func3()
	{
		this->func1();
	}
};

总结点一:

定义的对象调用自身所属类的函数成员

例:

int main()
{	
	A a;
	B b;
	cout << "*************" << endl;
	a.func1();
	a.func2();
	a.func3();
	cout << "*************" << endl;
	b.func1();
	b.func2();
	b.func3();
	cout << "*************" << endl;
	return 0;
}
//输出结果:
基类构造函数
基类构造函数
派生类构造函数
*************
基类函数func1
基类函数func2
基类函数func1
*************
派生类函数func1
派生类函数func2
派生类函数func1
*************

总结点二:

  1. 基类的指针指向派生类的对象,指针只能操作派生类从基类中继承过来的成员函数。
  2. c++的多态性(虚函数),可以使得指向派生类对象的基类指针操作派生类的成员函数。

例:

int main()
{	
	A a;
	B b;
	cout << "*************" << endl;
	A *p1 = &a;
	p1->func1();
	p1->func2();
	p1->func3();
	cout << "*************" << endl;
	A *p2 = &b;
	p2->func1();
	p2->func2();
	p2->func3();
	return 0;
}
//输出结果:
基类构造函数
基类构造函数
派生类构造函数
*************
基类函数func1
基类函数func2
基类函数func1
*************
派生类函数func1
基类函数func2
派生类函数func1

总结点三:

  1. 当指向派生类对象的基类指针指向不同的对象时,要释放原先的派生类对象的内存,否则会发生内存泄漏。
  2. delete指向派生类对象的基类指针时,指针指向的内存必须是动态分配的,否则程序出错。
  3. delete指向派生类对象的基类指针时,如若基类不使用虚析构函数,编译器在delete基类指针时便只能调用基类的析构函数,而不能调用派生类的析构函数,不能释放派生类可能分配的动态内存。

例:

int main()
{
	A a;
	B b;
	A *p3 = new B;
	delete p3;
	p3 = &b;
	//delete p3;//错误
	A *p4 = &b;
	//delete p4;//错误
	cout << "*************" << endl;
	A *p5 = NULL;
	delete p5;//当指针为NULL时,不会调用析构函数
	return 0;
}
//输出结果:
基类构造函数
基类构造函数
派生类构造函数
*************
基类构造函数
派生类构造函数
基类析构函数
*************
//如若基类的析构函数是虚函数,则结果如下:
基类构造函数
基类构造函数
派生类构造函数
*************
基类构造函数
派生类构造函数
派生类的析构函数
基类析构函数
*************

解析:

  1. A *p3 = new B;*p3指向的内存是在堆上动态分配的需要主动释放,而b是在栈上创建的,程序结束后会自动释放。delete p3;释放了new出来的内存之后程序中已经没有动态的内存了,因此不可再delete基类指针,p4错误同理。
  2. delete p3;该语句必不可少,如若此时不释放该动态分配的内存(new B),执行p3 = &b;之后,将没有指针指向该段内存,便已发生了内存泄漏。
  3. 如若基类不使用虚析构函数,则执行delete p3;时,只能调用基类的析构函数,不能调用派生类的析构函数,便不能释放派生类可能分配的动态内存。

纯手打 如有错 请指教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值