一个例子说明虚函数

本例子说明以下问题:

虚函数的定义,调用(外部函数的指针或引用,成员函数),构造函数和析构函数中调用虚函数,虚析构函数

赋值兼容,构造函数的重载,构造函数的初始化列表

见代码:

#include<iostream>

using namespace std;

class Base
{
	public:
		Base():m(1),n(m+1){Display();}  //构造函数中调用虚函数时自己的虚函数
		Base(int x,int y):m(x),n(y){}
		void setxy(int x,int y){m=x+1;n=y+1;}
		virtual void Display(){cout<<"m*n="<< m*n<<endl;}
		void fun(){cout<<"成员函数访问虚函数:";Display();}
		virtual ~Base(){cout<<"析构函数base"<<endl;}
	private:
		int m;
		int n;
};

class Subclass : public Base
{
	public:
		Subclass(int x,int y,int r1):Base(x,y),r(r1){Display();}  //继承构造函数
		void setxyr(int x,int y,int r){setxy(x,y);r=r;}  //继承成员函数
		void Display(){cout<<"sub--->"<<r*r<<",";Base::Display();}
		~Subclass(){cout<<"析构函数Subclass"<<endl;}

	private:
		int r;
};

void print(Base & p)
{
	cout<< "外部函数中使用引用调用虚函数:";
	p.Display();
}

void print2(Base *p)
{
	cout<< "外部函数中使用指针调用虚函数:";
	p->Display();
}

int main()
{
	Base *bp;
	Subclass *sp;

	Base b1;     //构造函数
	Base b(3,4);   //构造函数,有虚函数
	bp = &b;
	Subclass s(3,4,2);  //构造函数,有虚函数
	sp = &s;
	b1.setxy(7,8);
	s.setxy(4,5);
	s.setxyr(4,5,2);
	b1 = s;   //赋值兼容
	bp = sp;

	print(b1);    //外部函数中的虚函数,指向定义对象
	print(s);

	print2(bp);
	print2(sp);

	b1.fun();     //成员函数访问虚函数
	s.fun();

	b1.Display();
	b.Display();
	s.Display();

	delete bp;  //虚析构函数,指向基类的指针,调用适当的析构函数,先调用派生类
	system("pause");
}

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

时间: 2024-10-03 15:48:11

一个例子说明虚函数的相关文章

特别优秀的虚函数讲解博客地址

http://blog.csdn.net/haoel/article/details/1948051/ C++ 虚函数表解析 陈皓 http://blog.csdn.net/haoel 前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有“多种形态”,这是一种泛型技术.所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法.比如:模板技术,RTTI技术,虚函数技术,要么

看到的关于虚函数继承及虚继承解释比较好的文章的复制

(来源于:http://blog.chinaunix.net/uid-25132162-id-1564955.html) 1.空类,空类单继承,空类多继承的sizeof #include <iostream> using namespace std; class Base1 { }; class Base2 { }; class Derived1:public Base1 { }; class Derived2:public Base1, public Base2 { }; int main(

(C++)浅谈多态基类析构函数声明为虚函数

主要内容: 1.C++类继承中的构造函数和析构函数 2.C++多态性中的静态绑定和动态绑定 3.C++多态性中析构函数声明为虚函数 1.C++类继承中的构造函数和析构函数 在C++的类继承中, 建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推: 析构对象时,其顺序正好与构造相反: 具体参考文章:http://www.cnblogs.com/AndyJee/p/4575385.html 2.C++多态性中的静态绑定和动态绑定 对象的静态类型:对象在声明是采用的类型,在

C++虚函数和纯虚函数

只有用virtual声明类的成员函数,使之成为虚函数,不能将类外的普通函数声明为虚函数.因为虚函数的作用是允许在派生类中对基类的虚函数重新定义.所以虚函数只能用于类的继承层次结构中. 一个成员函数被声明为虚函数后,在同一类族中的类就不能再定义一个非virtual的但与该虚函数具有相同的参数(包括个数和类型)和函数返回值类型的同名函数. 根据什么考虑是否把一个成员函数声明为虚函数? ①  看成员函数所在的类是否会作为基类 ② 看成员函数在类的继承后有无可能被更改功能,如果希望更改其功能的,一般应该

C++学习笔记--从虚函数说开去

虚函数与纯虚函数: 虚函数:在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数,virtual  函数返回类型  函数名(参数表){函数体;} ,实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数.注意虚函数在基类中是有定义的,即便定义是空. 纯虚函数:在基类中是没有定义的,必须由派生类重定义实现,否则不能由对象进行调用. 看下面的例子: #include<iostream> using namespace std; class Cshape { p

C++虚函数及虚函数表解析

一.背景知识(一些基本概念) 虚函数(Virtual Function):在基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数.纯虚函数(Pure Virtual Function):基类中没有实现体的虚函数称为纯虚函数(有纯虚函数的基类称为虚基类).C++  “虚函数”的存在是为了实现面向对象中的“多态”,即父类类别的指针(或者引用)指向其子类的实例,然后通过父类的指针(或者引用)调用实际子类的成员函数.通过动态赋值,实现调用不同的子类的成员函数(动态绑定).正是因为这种

C++ 虚函数表解析(比较清楚,还可打印虚函数地址)

C++ 虚函数表解析 陈皓 http://blog.csdn.net/haoel 前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有“多种形态”,这是一种泛型技术.所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法.比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议. 关于虚函数的使用方法,我在这里不做过多的阐述.大家可以

析构函数定义为虚函数原因

析构函数定义为虚函数原因 先看下面一段程序: #include <iostream> using namespace std; class Person { public: virtual ~Person()                    //加了virtual,讲析构函数声明为虚函数 {    cout << "Person::~Person()" << endl; } }; class Student : public Person {

【C++】C++中的虚函数与纯虚函数

C++中的虚函数 先来看一下实际的场景,就很容易明白为什么要引入虚函数的概念.假设我们有一个基类Base,Base中有一个方法eat:有一个派生类Derived从基类继承来,并且覆盖(Override)了基类的eat:继承表明ISA(“是一个”)的关系,现在我们有一个基类的指针(引用)绑定到派生类对象(因为派生类对象是基类的一个特例,我们当然可以用基类指针指向派生类对象),当我们调用pBase->eat()的时候,我们希望调用的是Derived类的eat,而实际上调用的是Base类的eat,测试