【C++基础之十一】虚函数的用法

原创 2013年09月22日 15:38:42

虚函数的作用和意义,就不进行说明了,这里主要讨论下虚函数的用法。


1.典型的虚函数用法

可以看到,只有标识为virtual的函数才会产生运行时多态的效果。它只能借助指针或者引用来达到多态的效果。

class A
{
public:
	virtual void f(){cout<<"A::f()";}//虚函数
	void g(){cout<<"A::g()";}//普通函数
};

class B :public A{
public:
	virtual void f(){cout<<"B::f()";}
	void g(){cout<<"B::g()";}
};

class C :public A{
public:
	virtual void f(){cout<<"C::f()";}
	void g(){cout<<"C::g()";}
};

int _tmain(int argc, _TCHAR* argv[])
{
	A* pa=new B;//pa是指针喔
	pa->f(); // 调用B::f()
	pa->g(); // 调用A::g()
	delete pa;

	pa=new C;
	pa->f(); // 调用C::f()
	pa->g(); // 调用A::g()
	delete pa;

	pa=NULL;
	return 0;
}


2.虚函数的默认继承

虚函数是默认继承virtual属性的,即使在子类中没有标识virtual。

class A
{
public:
	virtual void f(){cout<<"A::f()";}
};

class B :public A{
public:
	void f(){cout<<"B::f()";}//不加virtual了
};

class C :public B{
public:
	void f(){cout<<"C::f()";}//也不加virtual了
};

int _tmain(int argc, _TCHAR* argv[])
{
	A* pa=new B;
	pa->f(); // 调用B:f()
	delete pa;

	pa=new C;
	pa->f(); // 调用C:f()
	delete pa;

	pa=NULL;
	return 0;
}


3.纯虚函数

纯虚函数和Java中的接口很像了,因为纯虚函数的存在导致了该类成了抽象类,它的主要作用就是规范接口,把实现留给子类。如果子类没有实现它的所有虚函数,那么该子类也是一个抽象类,通用不能进行实例化。

class A
{
public:
	virtual void f()=0;//纯虚函数,导致该类为抽象类
};

class B :public A{
public:
	virtual void f(){cout<<"B::f()";}
};

int _tmain(int argc, _TCHAR* argv[])
{
	//A* pa=new A;//出错,不能实例化抽象类
	A* pa=new B;
	pa->f();//调用B::f()
	delete pa;

	pa=NULL;
	return 0;
}


4.虚函数的调用模型

子类调用父类函数只有虚函数才得以执行,普通函数只会调用父类函数,不过要注意以下的h()可不能是构造函数或者析构函数,不然多态就无法实现。

class A
{
private:
	virtual void f(){cout<<"A::f()"<<endl;}
	void g(){cout<<"A::g()"<<endl;}
public:
	void h(){f();g();}
};

class B :public A{
private:
	virtual void f(){cout<<"B::f()"<<endl;}
	void g(){cout<<"B::g()"<<endl;}
};

int _tmain(int argc, _TCHAR* argv[])
{
	B b;
	b.h();//调用父类的h(),分别再调用f()和g()。f()为虚函数调用子类B::f(),g()为普通函数调用父类A::g()。

	return 0;
}

5.虚析构函数

虚构函数可以是虚函数,甚至是纯虚函数。如果它作为一个基类,那析构函数必须是虚函数。

而构造函数不能是虚函数。

class A
{
public:
    A(){p_a=new char[1];cout<<"new 1"<<endl;}
	virtual ~A(){delete[] p_a;cout<<"delete 1"<<endl;}//正常
	//~A(){delete[] p_a;cout<<"delete 1"<<endl;}//异常,内存泄漏,~B()并没有被执行到
private:
	char* p_a;
};

class B :public A{
public:
	B(){p_b=new char[2];cout<<"new 2"<<endl;}
	~B(){delete[] p_b;cout<<"delete 2"<<endl;}//能不能正确执行~B()成了关键
private:
	char* p_b;
};

int _tmain(int argc, _TCHAR* argv[])
{
	A* pa=new B;
	delete pa;

	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

C++虚函数经典例子

1, #include "stdio.h" #include using namespace std; class A { public: virtual void...
  • lskyne
  • lskyne
  • 2013年09月16日 14:53
  • 2397

C++中虚函数的用法详细讲解

我们知道,在同一类中是不能定义两个名字相同、参数个数和类型都相同的函数的,否则就是“重复定义”。但是在类的继承层次结构中,在不同的层次中可以出现名字相同、参数个数和类型都相同而功能不同的函数。例如在例...
  • zhuaimiao1
  • zhuaimiao1
  • 2015年10月15日 22:43
  • 1738

c++虚函数的使用方法

虚函数的使用方法: (1)在基类用virtual声明成员函数为虚函数。这样就可以在派生类中重新定义此函数,为它赋予新的功能,并能方便被调用。 在类外定义虚函数时,不必在定义virtual ...
  • tian_123456789
  • tian_123456789
  • 2016年05月08日 13:04
  • 9194

C++学习笔记之多态(虚函数)

多态可以分为静态的多态和动态多态,静态多态即所谓的函数重载,在编译阶段即可确定是使用哪个函数。动态多态是通过虚函数来实现的,并基于类的继承来表现。 在使用过程中应注意以下几点: 1、虚函数使用过程中,...
  • ljp1919
  • ljp1919
  • 2015年10月03日 15:16
  • 968

sdut 2088 数据结构实验之栈与队列十一:refresh的停车场

数据结构实验之栈与队列十一:refresh的停车场 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss ...
  • sxy201658506207
  • sxy201658506207
  • 2017年10月14日 21:00
  • 652

【c++基础】虚函数的使用以及和成员函数的区别

前言一直以来都知道虚函数的经典用法,但是除了本科时刚学c++的时候了解过,后来因为做不同的项目在不同的语言之间跳转(自觉都是浅尝辄止),这些基本的东西都忘记了,现在重拾并记录,权当巩固基础了。经典用法...
  • XiaoHeiBlack
  • XiaoHeiBlack
  • 2016年11月01日 14:11
  • 919

析构函数和虚函数的用法和作用

析构函数也是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载,只有在类对象的生命期结束的时候,由系统自动调用。有释放内存空间的做用!虚函数是C++多态的一种表现 例如:子类继承了父...
  • yuwei19840916
  • yuwei19840916
  • 2008年11月21日 11:46
  • 2935

数据结构与算法(C++版):表、栈和队列

前言本系列博客为学习数据结构与算法过程中的原创笔记,其中代码实现基于C++语言。STL中的向量和表在C++语言的库中包含有公共数据结构的实现,这就是众所周知的标准模版库(Standard Templa...
  • u013271326
  • u013271326
  • 2017年06月06日 11:37
  • 243

C++虚函数的定义与意义

我们知道,在同一类中是不能定义两个名字相同、参数个数和类型都相同的函数的,否则就是“重复定义”。但是在类的继承层次结构中,在不同的层次中可以出现名字相同、参数个数和类型都相同而功能不同的函数。例如在例...
  • u011392772
  • u011392772
  • 2015年01月30日 09:55
  • 1685

C++虚函数简单的例子

#include #include using namespace std; class A { public: A(){}; virtual void Fun() { cou...
  • taoerit
  • taoerit
  • 2014年08月26日 12:26
  • 807
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C++基础之十一】虚函数的用法
举报原因:
原因补充:

(最多只允许输入30个字)