100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 重拾C++之虚函数和虚基类以及抽象类

重拾C++之虚函数和虚基类以及抽象类

时间:2024-02-05 11:36:01

相关推荐

重拾C++之虚函数和虚基类以及抽象类

为什么80%的码农都做不了架构师?>>>

一、引言

好久没接触过C++了,今天突然要用一点感觉号蛋疼,用惯了python感觉C++一点都不会了。

声明了一个类的对象居然用这种方法,脑子绝对是被驴(python)踢了classA{...}a=A();//尼玛这都能行,被踢大了

二、虚函数和一般函数

虚函数就是加了vritual关键字的函数,引入虚函数的目的是为了实现多态性(在此为运行时的多态性),即可以通过父类的指针调用子类的对象,从而产生不同的效果。

virtualvoidshow(){cout<<"hellomynameisa"<<endl;}

废话不多说,为了展示虚函数和一般函数的区别看看下面一个个例子:

#include<iostream>usingnamespacestd;classA{private:inta;intb;public:A(inta,intb){this->a=a;this->b=b;cout<<"hellobaseA"<<endl;cout<<a<<'-'<<b<<endl;}//定义一个虚函数virtualvoidshow(){cout<<"hellomynameisa"<<endl;}};classD:publicA{public:D(inta,intb):A(a,b){cout<<"hellobaseA"<<endl;cout<<a<<'-'<<b<<endl;}voidshow(){cout<<"hellomynameisd"<<endl;}};classE:publicA{public:E(inta,intb):A(a,b){cout<<"hellobaseA"<<endl;cout<<a<<'-'<<b<<endl;}voidshow(){cout<<"hellomynameise"<<endl;}};intmain(){A*p;Dd=D(1,2);p=&d;p->show();Ee=E(1,2);p=&e;p->show();}

编译,运行输出中有这么两行:

hellomynameisdhellomynameise

然后去掉关键字vritual,在编译运行,上面两行变成了

hellomynameisahellomynameisa

看到区别了吧!对于普通函数,虽然父类的指针指向了子类的对象,但是调用的仍然是父类的函数,而虚函数则是执行子类中新定义的函数。

三、虚函数和纯虚函数

学过java的都知道有类和接口两种不一样的东西(其实我在装逼,java也就会i++了.*_*!!),纯虚函数就类似于接口,纯虚函数不能在定义类中实现,但应该在能够实例化的子类中实现。定义了纯虚函数的类就要抽象类(记住是抽象类不是虚基类,网上有个逼说是虚基类,此贴居然还有好多人转发,真是害人不浅。好吧也许真是虚基类,那就当我是逼吧^_^)。抽象类不能够被实例化。

四、虚继承和虚基类

虚继承的主要是为了解决多重继承中出现的二义性问题,普通继承如果一个基类通过几条路径继承到了一个派生类中,那么这个派生类将有两个基类的副本,对这些成员的访问将会出现二义性错误。

//虚继承是这样的classA:publicvritualB{....}

虚基类:虚基类是指虚继承中的基类,记住不是含有纯虚函数的类(抽象类)

注意:对于虚基类的初始化即使是是间接继承,在派生类的构造函数中也应该显示的调用其构造函数,否则将调用默认的构造函数(没有参数,如果没有定义自己的构造函数,系统将会定义默认的构造函数,否则没有默认构造函数),如果没有默认构造函数,程序将会出错。

五、总结

虚函数是为了实现多态性,虚基类是为了解决多重继承的二义性问题,除此之外似乎没有任何关系(唯一有关系也是虚的,所以有关系是假的)。

虚基类是虚继承中的基类,抽象类是含有纯虚函数的类,两者完全不同。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。