`

vitual 函数

    博客分类:
  • c++
 
阅读更多
虚函数:通过基类对象指针指向派生类对象,或通过基类对象引用来引用派生类对象

#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::cin;
using std::string;

class ex0{
	public: 
	virtual string show(){
		return "0号异常";;
	}
};
class ex1 : public ex0
{
	public:
	string show()
	{
	return "1号异常";
	}
};
class ex2 : public ex0
{
	public:
	string show()
	{
	return "2号异常";
	}
};
class ex3 : public ex0
{
	public:
	string show()
	{
	return "3号异常";
	}
};
int main()
{
	ex1 a;
	ex2 b;
	ex3 c;
	cout<<"请输入一个异常编号:"<<endl;
	int n;
	cin>>n;
	try
	{  
		switch(n)
		{
		case 1: throw a;
		case 2: throw b;
		case 3: throw c;
		default:  cout<<"输入的数不在范围之内."<<endl;
		}
	}
	catch(ex0 & e)
	{ 
	cout<<"在main函数中捕获了"<<e.show()<<endl;
	}
//	catch(ex2 e )
//	{
//	cout<<"在main函数中捕获了"<<e.show()<<endl;
//	}
//	catch(ex3 e)
//	{
//	cout<<"在main函数中捕获了"<<e.show()<<endl;
//	}
	return  0;
}




#include <iostream>
#include <string>
using namespace std;
class Person
{
public:
	Person(string i="10000",string na="noname",int a=0,char s='M') //Person类构造函数
	{
		id = i;
		name = na;
		age = a;
		sex = s;
	}
	void SetData(string i="10000",string na="noname",int a=0,char s='M') //修改信息
	{
		id = i;
		name = na;
		age = a;
		sex = s;
	}
	virtual void ShowInfo( )  //定义虚函数
	{
		cout<<endl;
		cout<<"Id:    "<<id<<endl;
		cout<<"name:  "<<name<<endl;
		cout<<"age:   "<<age<<endl;
		cout<<"sex:   "<< (sex=='M'?"Man":"Woman") <<endl;
	}
protected:
	string    id;
	string   name;
	int     age;
	char    sex;
};  //End of Person
class UnderGraduate:virtual public Person
{
public:
	UnderGraduate(string i,string na,int a,char s,string ma,float sc) //构造函数
		:Person(i,na,a,s)          //初始化列表
	{
		major = ma;
		score = sc;
	}
	void SetData(string i,string na,int a,char s,string ma,float sc) //修改信息
	{
		Person::SetData(i,na,a,s);
		major = ma;
		score = sc;
	}
	void ShowInfo()  //显示信息
	{
		cout<<endl;
		Person::ShowInfo();
		cout<<"major: "<<major<<endl;
		cout<<"score: "<<score<<endl;
	}
protected:
	string    major;
	float   score;
};  //End of UnderGraduate
class Teacher: virtual public Person
{
public:
	Teacher(string i,string na,int a,char s,float sa)  //Teacher类构造函数
			:Person(i,na,a,s),salary(sa)
	{		
	}
	void SetData(string i,string na,int a,char s,float sa)
	{
		Person::SetData(i,na,a,s);
		salary = sa;
	}
	void ShowInfo()
	{
		Person::ShowInfo();
		cout<<"salary: "<<salary<<endl;
	}
protected:
	float salary;
};  //End of Teacher
class Graduate:public UnderGraduate, public Teacher		// 从两个类继承
{
public:
	Graduate(string i,string na,int a,char s,string ma,float sc,float sa)
		:UnderGraduate(i,na,a,s,ma,sc),Teacher(i,na,a,s,sa),Person(i,na,a,s)
	{
	}
	void SetData(string i,string na,int a,char s,string ma,float sc,float sa)
	{   //修改信息
		Person::SetData(i,na,a,s);
		major = ma;
		score = sc;
		salary = sa;
	}
	void ShowInfo()  //显示信息
	{   
		cout<<endl;
		cout<<"Id:    "<<id<<endl;
		cout<<"name:  "<<name<<endl;
		cout<<"age:   "<<age<<endl;
		cout<<"sex:   "<< (sex=='M'?"Man":"Woman") <<endl;
		cout<<"major: "<<major<<endl;
		cout<<"score: "<<score<<endl;
		cout<<"salary:"<<salary<<endl;
	}
};  //End of Graduate
int main()
{
	Person * personPtr;  //定义基类Person的指针
	Person ObjectP("201302034","ZhangNing",21,'W');
	personPtr = &ObjectP;  //基类的指针指向基类Person的对象
	personPtr->ShowInfo();
	UnderGraduate ObjectUG("201302034","ZhangNing",21,'W',"Computer",98.5);
	personPtr = &ObjectUG;  //基类的指针指向派生类UnderGraduate的对象
	personPtr->ShowInfo();
	Teacher ObjectT("201302034","ZhangNing",21,'W',1800);
	personPtr = &ObjectT;  //基类的指针指向派生类Teacher的对象
	personPtr->ShowInfo();
	Graduate ObjectG("201302034","ZhangNing",21,'W',"Computer",98.5,1800);
	personPtr = &ObjectG;  //基类的指针指向派生类Graduate的对象
    personPtr->ShowInfo();
    return 0;
}

分享到:
评论

相关推荐

    第8章-- virtual函数 与多态

    第8章--virtual函数与多态

    虚函数与const指针

    在基类的类定义中定义虚函数的一般形式为:`virtual 函数返回值类型 虚函数名(形参表) { 函数体 }` 虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数。在定义了虚函数后,可以在基类...

    内联函数inline使用实例

    2. **不能用于virtual函数**:内联函数不能与多态性结合,因此不能用于虚函数。虚函数的调用需要通过运行时的动态绑定,这与内联的编译时处理相冲突。 3. **内联函数与模板**:模板函数默认被编译器视为内联,因为...

    浅谈C++中强制类型转换函数

    dynamic_cast常用于基类和子类之间的转换,需要在无法使用virtual函数时使用。 reinterpret_cast是重新解释类型的操作符,它可以将一个类型转换为另一个类型,但没有进行二进制的转换。reinterpret_cast常用于将一...

    详解C++虚函数的工作原理

    另外,存在着虚函数表,该表里存放着 Base 类的所有 virtual 函数。 我们可以通过以下代码来访问虚函数表: ```cpp int _tmain(int argc, _TCHAR* argv[]) { typedef void(*pFunc)(void); Base b; cout 虚函数表...

    C++中基类的析构函数为什么要用virtual虚析构函数.pdf

    C++ 中基类的析构函数为什么要用 virtual 虚析构函数 C++ 中基类的析构函数为什么要用 virtual 虚析构函数?这是一个非常重要的问题。在 C++ 中,基类的析构函数如果不使用 virtual 虚析构函数,可能会导致内存泄漏...

    C++析构函数使用virtual的原因

    使用`virtual`关键字声明析构函数,能够确保派生类的析构函数在通过基类指针或引用来删除对象时被正确调用,避免资源泄露和其他潜在问题。 ### 为何析构函数需要virtual 1. **多态性与析构** 当一个类作为基类时...

    多态性与虚函数讲稿.pptx

    一个纯虚函数是在基类中声明但没有定义的函数,其声明形式为`virtual 函数名() = 0;`。含有纯虚函数的类称为抽象类,不能直接创建抽象类的实例,但可以作为其他类的基类。派生类必须为纯虚函数提供实现,否则也会...

    [面试/笔试系列11]C++面试题

    如果子类在覆盖父类的`virtual`函数时不加`virtual`关键字,那么这个函数仍然是虚函数,并且依然支持多态。 - **virtual修饰符是否会被隐形继承?** `virtual`关键字并不会被“隐形”继承。这意味着即使子类没有...

    5.2+纯虚函数与抽象类1

    virtual 函数类型 函数名(参数列表) = 0; ``` 例如,在二维图形的例子中,`getArea` 函数被声明为纯虚函数: ```cpp virtual double getArea() = 0; ``` 纯虚函数的存在使得包含它的类成为一个抽象类。抽象类不能...

    C抽象基类和纯虚成员函数-C教程共3页.pdf.zip

    其声明形式为`virtual 函数名() = 0;`。纯虚函数的存在使得包含它的类成为抽象的,因此不能直接创建该类的实例。纯虚函数定义了一个必须由派生类重写的接口,这样每个派生类都能根据自己的需求提供特定的实现。 ...

    C++- 抽象类(存虚函数)、接口、多重继承1

    首先,抽象类是一种包含至少一个纯虚函数(virtual 函数声明但没有定义)的类。在C++中,这样的类不能被实例化,通常用作基类,为派生类提供公共的行为和属性。存虚函数的目的是确保即使基类没有实例,其派生类的...

    虚函数c++语言

    虚函数:在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数表) {函数体};实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名...

    C++中的虚函数(virtual function)

    ### C++中的虚函数(virtual function) 在C++编程语言中,虚函数是一种非常重要的特性,它主要用于实现多态性(polymorphism),这是面向对象编程的一个核心概念。通过虚函数,程序可以在运行时动态地决定调用哪个具体...

    Effective C++ 中文版

    合理地使用virtual函数和non-virtual函数来定义接口和实现。 5. 条款5:考虑写出一个不抛异常的swap函数 - swap函数通常用于帮助实现异常安全代码。不过,需要考虑当对象内部包含异常时如何保证swap函数不会抛出...

    C语言笔试面试题大全.doc

    3. 如果父类写了一个virtual函数,如果子类覆盖它的函数不加virtual,也能实现多态?答案:只要基类在定义成员函数时已经声明了virtue关键字,在派生类实现的时候覆盖该函数时,virtue关键字可加可不加,不影响多态...

    虚函数的真相(VC编译器如何实现“virtual ”规则)

    在C++中,我们使用“virtual”关键字来标记一个函数为虚函数。例如: ```cpp class Base { public: virtual void print() { cout ; } }; class Derived : public Base { public: void print() override { cout ;...

    C++ 中virtual 虚函数用法深入了解

    下面将详细解释`virtual`虚函数的用法及其重要性。 一、虚拟函数(Virtual Function) 虚函数的声明通常在基类中,通过在函数声明前加上`virtual`关键字来实现。这样做的目的是使得基类的指针或引能够根据实际指向...

    浅析C++中的虚函数

    一、定义定义:在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数。 语法:virtual 函数返回类型函数名(参数表) { 函数体 } 用途:实现多态性,通过指向派生类的基类指针,访问派生类中同名...

Global site tag (gtag.js) - Google Analytics