【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++学习笔记27,虚函数的工作原理

C++规定了虚函数的行为,但是将实现交给了编译器的作者. 通常,编译器处理虚函数的方法是给每一个对象添加一个隐藏成员.隐藏成员中保存了一个指向函数地址数组的指针. 这个数组称为虚函数表(virtual...

【C++基础之十二】虚函数表和覆盖机制

1.引出 我们先来看个例子: //空类 class A{}; //int成员变量 class B{ int value; }; //普通成员方法 class C{ void f(){}; }; ...

虚函数的作用和用法C++.doc

  • 2011年07月15日 12:38
  • 52KB
  • 下载

C++精进篇(十一)之―虚函数和多态

C++虚函数与多态: 1.C++中的虚函数 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以...

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

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

C++基础:纯虚函数和抽象类

纯虚函数是一种特殊的虚函数,它的一般格式如下:     class     {         virtual ()=0;         …     };     在许多情况下,在基类...

C++ 基础知识点 九 第10章 多态性与虚函数

第10章  多态性与虚函数 【内容提要】 多态性的概念; 函数和运算符的重载; 虚函数和抽象类。 【重点与难点】 10.1 多态性的概念 在面向对象的概念中,多态性是指不同对象接收到相同...

C++语言基础 例程 虚函数

贺老师的教学链接  本课讲解指向基类的指针,为何只能访问来自基类成员?!#include #include using namespace std; //声明基类Student class Stu...

C++基础---虚函数

1. 虚函数 1.1 虚函数的定义 虚函数:就是在基类的成员函数前加关键字virtual(即被virtual关键字修饰的成员函数),并在一个或多个派生类中被重新定义的成员函数; 虚函数:就是在编译...
  • cainv89
  • cainv89
  • 2015年09月04日 16:08
  • 319

C++基础:多态 虚函数

面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为。在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数体。也可以这样说就是实现了“一个接...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C++基础之十一】虚函数的用法
举报原因:
原因补充:

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