虽然不是我的面试题,但是对C++情有独钟的菜鸟还是可以看看的!
2011-11-06 09:25
302 查看
代码1:这个是偶尔在一篇文章上看到的一段代码,是关于编译和运行时的区别的:
#include <iostream> using namespace std; class A { public: virtual void f(){cout<<"A"<<endl;} }; class B:public A { private: void f(){cout<<"B"<<endl;} }; int main() { A* pA = new B(); pA->f(); //B return 0; }
这里为什么能编译通过呢,B类里面的f()是私有的,按道理是不能被访问的,会编译出错的。记得原文好像大概意思是:程序的访问控制权限只在编译时进行了限制,在运行时是不受限制的,上面定义了个A类的指针pA,在编译时由于A类里面有个public的f()函数,所以编译通过,但是由于是虚函数,联系到运行时多态,是执行的指向的子类对象的f()函数,由于运行时已经不受访问权限的限制了,所以可以输出B,大概就是这个意思了。其实最主要一点就是访问权限只在编译时有效!
当时对这个还不是很了解的时候,在学校bbs上问了下,有位大牛级的人物看到后给出了关于delete之类的东西,我当时不懂,跟他一解释,才发现他看错了。然后我问他delete之类的是什么,得到解答是C++11的新标准里的一个特性,一个测试代码如下:
#include <iostream> using namespace std; class Base { public:Base(){} public: Base(const Base &) { cout << "Base copy assignment was called!" << endl; } }; class Derived:public Base { public:Derived(){} public: Derived(const Derived&) { cout << "Derived copy assignment was called!" << endl; } /* * public:Derived(const Derived&)=delete; */ }; int main() { Base b; Derived d; cout << "############" << endl; Derived d1 = d; //Derived copy assignment was called! return 0; }//此代码貌似在VC6.0下不能通过,编译器太落后了,只知道VS2010和gcc都能通过。注释的那里看到了没,以前在类里面想禁用一个成员函数,就是什么private权限之类的,C++0x(确切的应该是C++11了)新标准给出了一个最新的方法,只有在要禁用的函数后面加上delete就可以了,如Derived(const Derived&)=delete;则可以实现禁用Derived类的copy assignment函数;同样还有个default关键字给出了在出现多个同名函数的时候可以实现默认调用某个函数的功能,具体细节就不展示了,可以google
C++11新特性里面的default、delete之类的关键字,讲解的应该比我好多了,在这里只是抛砖引玉!
相关文章推荐
- 虽然我不是windows端程序员,但是这个IOCP讲的还是可以的
- c++中十道面试题(一),可以看看喔
- sdwebimagedownloader。m这个文件里面加了user-agent验证就可以了,现在问题虽然解决了。但是还是没搞懂原因
- AnsiString 在 Delphi 中虽然不可用,但是,在 C++ 中可以用
- 记住账号密码的input背景是黄色的,并不是很丑,但是假如你不喜欢,可以来看看
- 因特网上Cookies是如何工作的(转),虽然不是讲.net,但是把cookiers的讲解非常清楚,可以让开发更好!
- oracle的在sql语句后加for update 不是都起作用的,对于单表是可以的,但是对于多表关联(无论left join还是内连接等)都不能修改
- 转一篇c++指针的文章(虽然程序不是很规范,但是介绍的不错)
- 第一次来到这里,虽然技术差,但是可以自由的写一些东西,还是很开心的
- C++对象模型(虽然在GCC下很大的不同,但是先收藏)
- ruby的aop,虽然不知道为什么ruby要用aop但是还是学些下这个思想
- 我心目中的牛程序员、我们可以对比看看(人家还是看多年朋友面子上才肯帮忙1周,至少需支付1万元辛苦费)
- 有的女生就像Windows 虽然很优秀,但是安全隐患太大。有的女生就像UNIX 她条件很好,然而不是谁都能玩的起
- 引入接口目的是把实现者和用户相分离,但是反射还是可以访问实现者
- gtk不是C语言的专属,c++也可以
- 推荐一个比较不错JSON字符串处理网站,虽然性能不是很强,但是还不错比起其他的
- 自定义tabpageindicator,可以自定义tab是三角形还是矩形,但是tab不具有滑动的功能
- 你可能不知道位图,但是它真的很有用,特殊情况可以使时间复杂度降低不是一两个档次那么简单...
- 01.MySQL的安装,配置,卸载(虽然不是做搞数据库,希望可以帮到人)
- [Web]大二学生必读 - 虽然我大三了,但是觉得还是很不错。。。