C++接口类的实现

上传人:鲁** 文档编号:474021388 上传时间:2023-08-01 格式:DOCX 页数:5 大小:13.60KB
返回 下载 相关 举报
C++接口类的实现_第1页
第1页 / 共5页
C++接口类的实现_第2页
第2页 / 共5页
C++接口类的实现_第3页
第3页 / 共5页
C++接口类的实现_第4页
第4页 / 共5页
C++接口类的实现_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《C++接口类的实现》由会员分享,可在线阅读,更多相关《C++接口类的实现(5页珍藏版)》请在金锄头文库上搜索。

1、C+不像java 一样有纯接口类的语法,但我们可以通过一些手段实现相同的功能。考虑这样的代码Class AproteCted: virtual A() Cout _FUNCTION_ endl; ;Class B : publiC ApubliC:virtual B()Cout _FUNCTION_ endl; ;_tmain(int argc,_TCHAR* argv)A* p1 = new A;/1有问题delete p1;B* p2 = new B;delete p2;/没2问题的A* p3 = new B;delete p3;/3有 问题intreturn 0;通过在类中,将类的构造函

2、数或者析构函数申明成protected,可以有效防止类被实例话, 要说实用的话,构造函数是 proteCted 更有用,肯定能保证类不会被实例化,而如果析构 函数是protected的话,构造函数不是protected的话,还可能存在编译通过的漏洞,如 下:A:class Aprotected:A()cout _FUNCTION_ endl;int _tmain(int argc, _TCHAR* argv)A* p1 = new A;/编/译不通过,无法访问 protected 构造函数delete p1;return 0;B:class Aprotected:A()cout _FUNCTI

3、ON_ endl;int _tmain(int argc, _TCHAR* argv)A*p1 = new A;/编/ 译通过,此时因为仅仅是用到了 A 的构造函数还不需要它的析构函数return 0;C:class Aprotected:A()cout _FUNCTION_ endl;int _tmain(int argc, _TCHAR* argv)A* p1 = new A;delete p1; / 编译失败,因为编译器发现 A 的析构函数是 protectedreturn 0; 所以,一种可行的办法貌似是这样的: class Aprotected:virtual A() cout _F

4、UNCTION_ endl;class B : public A;int _tmain(int argc, _TCHAR* argv)B* p =new B;/这/ 种情况下确实是可行的delete p;return 0;由于B public继承自A,所以其可以完全访问A的构造或析构函数,但是:int _tmain(int argc, _TCHAR* argv)A* p =new B;delete p;由/于 p 变成指向 A 的指针,字面上编译器需要知道A的析构函数,然后A的析构函数又是protectedreturn 0;即便像这样B显示重载了 A的析构函数:class Aprotected

5、:virtual A() cout _FUNCTION_ endl;class B : public Apublic:virtual B() cout _FUNCTION_ endl;int _tmain(int argc, _TCHAR* argv)A* p =new B;delete p;也/还是不行,因为重载是运行时的事情,在编译时编译器就认定了A的析构函数,结果无法获取return 0小结:貌似用 protected 这样的方法并不是很恰当,虽然在遵守一定规则的情况下确实有他的实 用价值,但并不是很通用。*.其实上面 protected 的思路是对的,无非是让父类无法实例化,那么为了让

6、父类无法实例 化,其实还有一个方法,使用纯虚函数。class Apublic:/这/ 里就不用 protected 了virtual A() = 0;class B : public A;int _tmain(int argc, _TCHAR* argv)B* p =new B;delete p;return 0;这样写貌似不错,以往大家都把类中的一般成员函数写成纯虚的,这次将析构函数写成纯虚 的,更加增加通用性,编译也通过了,但就是在链接的时候出问题,报错说找不到A的析构 函数的实现,很显然吗,因为 A 的析构是纯虚的吗。class Apublic:/这/ 里就不用 protected 了v

7、irtual A() = 0它/虽然是个纯虚函数,但是默认实现,可以有这/个/语法很好很强大,经过小强的指点终于高清了他的用法(完全是为了实现其接口类而弄的语法吧)cout _FUNCTION_ endl;class B : public A;int _tmain(int argc, _TCHAR* argv)B* p =new B; delete p;A* p2 =new B;delete p2;/不用担心编译器报错了,因为此时 A 的析构函数是publicreturn 0;如此终于大功告成了,注意,不能将构造函数替代上面的析构函数的用法,因为构造函数是 不允许作为虚函数的。补充:以上那个语法就真的只是为了这种情况而存在的,因为一般我们在虚类中申明的接口virtual foo() = 0;virtual foo() = 0 这两种写法是完全没有区别的,纯虚函数的默认实现,仅仅在它是析构函数中才有意义 ! 所以可以说,老外是完全为了这一个目的而发明了这种语法.最终的接口类class Interfacepublic:virtual Interface() = 0 ;应该挺完美的了吧

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 建筑资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号