- 浏览: 29033 次
- 性别:
- 来自: 广州
文章分类
最新评论
虚函数:通过基类对象指针指向派生类对象,或通过基类对象引用来引用派生类对象
#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; }
发表评论
-
c++ lamda 函数
2020-02-08 08:40 499// lamda.h #include<iostre ... -
大小端转换
2018-12-06 18:39 1407https://stackoverflow.com/que ... -
c++11 thread 初始化
2018-06-06 09:08 1567class background_task{ publi ... -
c++类型转换和隐式类型转换
2018-05-28 13:19 0https://blog.csdn.net/qq_2 ... -
整数相乘容易出错实例
2018-05-24 08:46 1446/// /* 1、测试 两个 int3 ... -
(转)Linux C++程序进行性能分析工具gprof使用入门
2018-04-12 19:35 1112转自https://blog.csdn.net/garfie ... -
__gnu_parallel::sort()对空间是否有要求
2018-04-04 15:03 640目的:在使用__gnu_parallel::sort() ... -
delete 对象后调用该对象的方法程序不报错
2018-03-27 10:30 478delete 一个对象后,在执行该对象的方法,并不会报 ... -
ubuntu拼音设置
2018-03-25 08:32 556Ubuntu16.04 已经自带pinyin输入法,直接设 ... -
delete 数组后 指针是否为null
2018-03-21 14:54 1101/** \brief 测试 delete 数组指 ... -
new 数组越界 系统不会报错
2018-03-21 15:00 977/** \brief 测试 数组越界 , 系统是 ... -
ubuntu 16.04 codeblocks 配置 openmp
2018-03-08 09:34 1260( 转载:http://www.voidcn.com/ar ... -
Ubuntu 16.04 Linux系统内核升级方法(转)
2018-03-03 09:59 3203转载地址:http://blog.csdn.net/csdn ... -
编程错误总结
2018-02-08 10:30 381codeBlocks 中,sizeof() 函 ... -
错误示例:字节对齐
2018-02-05 22:51 609#include<vector> #incl ... -
__attribute__((packed))详解
2018-02-05 22:20 1010转自 http://blog.csdn.net ... -
错误示例:包引入顺序
2018-02-05 21:51 336#include<vector> #inclu ... -
文件读写代码
2018-02-05 14:52 221#include <iostream> #in ... -
C++统计代码运行时间计时器(转)
2018-02-05 11:59 2189转自http://blog.csdn.net/ap1005 ... -
右值引用与转移语义
2018-01-26 14:52 274转载自《https://www.ibm.com/develo ...
相关推荐
第8章--virtual函数与多态
在基类的类定义中定义虚函数的一般形式为:`virtual 函数返回值类型 虚函数名(形参表) { 函数体 }` 虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数。在定义了虚函数后,可以在基类...
2. **不能用于virtual函数**:内联函数不能与多态性结合,因此不能用于虚函数。虚函数的调用需要通过运行时的动态绑定,这与内联的编译时处理相冲突。 3. **内联函数与模板**:模板函数默认被编译器视为内联,因为...
dynamic_cast常用于基类和子类之间的转换,需要在无法使用virtual函数时使用。 reinterpret_cast是重新解释类型的操作符,它可以将一个类型转换为另一个类型,但没有进行二进制的转换。reinterpret_cast常用于将一...
另外,存在着虚函数表,该表里存放着 Base 类的所有 virtual 函数。 我们可以通过以下代码来访问虚函数表: ```cpp int _tmain(int argc, _TCHAR* argv[]) { typedef void(*pFunc)(void); Base b; cout 虚函数表...
C++ 中基类的析构函数为什么要用 virtual 虚析构函数 C++ 中基类的析构函数为什么要用 virtual 虚析构函数?这是一个非常重要的问题。在 C++ 中,基类的析构函数如果不使用 virtual 虚析构函数,可能会导致内存泄漏...
使用`virtual`关键字声明析构函数,能够确保派生类的析构函数在通过基类指针或引用来删除对象时被正确调用,避免资源泄露和其他潜在问题。 ### 为何析构函数需要virtual 1. **多态性与析构** 当一个类作为基类时...
一个纯虚函数是在基类中声明但没有定义的函数,其声明形式为`virtual 函数名() = 0;`。含有纯虚函数的类称为抽象类,不能直接创建抽象类的实例,但可以作为其他类的基类。派生类必须为纯虚函数提供实现,否则也会...
如果子类在覆盖父类的`virtual`函数时不加`virtual`关键字,那么这个函数仍然是虚函数,并且依然支持多态。 - **virtual修饰符是否会被隐形继承?** `virtual`关键字并不会被“隐形”继承。这意味着即使子类没有...
virtual 函数类型 函数名(参数列表) = 0; ``` 例如,在二维图形的例子中,`getArea` 函数被声明为纯虚函数: ```cpp virtual double getArea() = 0; ``` 纯虚函数的存在使得包含它的类成为一个抽象类。抽象类不能...
其声明形式为`virtual 函数名() = 0;`。纯虚函数的存在使得包含它的类成为抽象的,因此不能直接创建该类的实例。纯虚函数定义了一个必须由派生类重写的接口,这样每个派生类都能根据自己的需求提供特定的实现。 ...
首先,抽象类是一种包含至少一个纯虚函数(virtual 函数声明但没有定义)的类。在C++中,这样的类不能被实例化,通常用作基类,为派生类提供公共的行为和属性。存虚函数的目的是确保即使基类没有实例,其派生类的...
虚函数:在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数表) {函数体};实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名...
### C++中的虚函数(virtual function) 在C++编程语言中,虚函数是一种非常重要的特性,它主要用于实现多态性(polymorphism),这是面向对象编程的一个核心概念。通过虚函数,程序可以在运行时动态地决定调用哪个具体...
合理地使用virtual函数和non-virtual函数来定义接口和实现。 5. 条款5:考虑写出一个不抛异常的swap函数 - swap函数通常用于帮助实现异常安全代码。不过,需要考虑当对象内部包含异常时如何保证swap函数不会抛出...
3. 如果父类写了一个virtual函数,如果子类覆盖它的函数不加virtual,也能实现多态?答案:只要基类在定义成员函数时已经声明了virtue关键字,在派生类实现的时候覆盖该函数时,virtue关键字可加可不加,不影响多态...
在C++中,我们使用“virtual”关键字来标记一个函数为虚函数。例如: ```cpp class Base { public: virtual void print() { cout ; } }; class Derived : public Base { public: void print() override { cout ;...
下面将详细解释`virtual`虚函数的用法及其重要性。 一、虚拟函数(Virtual Function) 虚函数的声明通常在基类中,通过在函数声明前加上`virtual`关键字来实现。这样做的目的是使得基类的指针或引能够根据实际指向...
一、定义定义:在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数。 语法:virtual 函数返回类型函数名(参数表) { 函数体 } 用途:实现多态性,通过指向派生类的基类指针,访问派生类中同名...