挂羊头卖犬肉 挂羊头卖犬肉
挂羊头卖狗肉的人
关注数: 104 粉丝数: 398 发帖数: 4,246 关注贴吧数: 63
发现使用C++虚函数多态时的 比较奇特的两种状况 昨天发现了一个问题,在贴吧发了个帖子求助: http://tieba.baidu.com/p/2400159340?pid=34180331778&cid=#34180331778 今天终于弄明白了,现总结如下,发出来水下经验 ①、可以通过基类指针访问派生类的private型的虚成员函数 现象如下: class A ,然后里面有一个 public: virtual void f(); class B :public A,然后里面有一个private virtual void f(); 现在 A *p; p->f(); 这样,可以在类外访问B类的私有成员函数 f(); ②、在一个类的某成员函数中调用本类的虚成员函数的时候,这个成员函数是否是构造函数会导致调用不同层的虚成员函数。现象如下, class A,在A中定义一个虚成员函数 virtual void vf();,再定义一个实成员函数 void g(),在g()中调用了 vf(); class B:public A,定义一个非虚函数void p(),在这个函数中调用 g(); 再在B中重写virtual void vf(); 现在,B x, x.p(); 这个调用过程为 首先调用A::g(),借下来调用B::vf(); 这种情况有个特里,如果A中的g()恰好是A的构造函数,则构造函数内部调用虚成员函数只会调用本层的成员函数,或者是低于于本层的成员函数。 测试代码如下: 使用VS2010 #include <iostream> using namespace std; class time { public: time() { // display(); //如果在这里写就不行,也就是说构造函数是一个特殊的函数,它内部的调用本类的虚成员函数执行本层的虚成员函数,而不多态 hour=1; minute=1; second=1; } void f() { display(); //这里调用的是最顶层的派生类重载的display(); } virtual void display() { hour=3; minute=3; second=3; cout<<hour<<"小时"<<minute<<"分钟"<<second<<"秒"<<endl; } int hour; int minute; int second; }; class date:public time { public: virtual void display() { hour=2; minute=2; second=2; cout<<hour<<"小时"<<minute<<"分钟"<<second<<"秒"<<endl; } void g() { f(); } }; int main() //C++使用多态的时候使用基类还是派生类的指针都无所谓,结果相同 { date t1; //time *p; //p=&t1; //这样可以在类外访问派生类的私有虚成员函数 //p->display(); t1.g(); return 0; }
求问如何在指定内存上创建对象 求问下面的 “2 级:总是使用malloc,或者 char[100] 来获得内存,但不知道怎么在指定内存上面创建对象。 ”,如何在指定内存上面创建对象? 附:c++程序员的几个境界 0 级:简历上写着了解c++, 实际上不知道mfc 根 VC有什么区别。 1 级:简历上写着精通c++, 但是仅仅知道mfc, 认为VC就是C++的一切。 2 级:总是使用malloc,或者 char[100] 来获得内存,但不知道怎么在指定内存上面创建对象。 3 级:感觉 std::string 没有 CString 好用! 听说过g++。 4 级:会使用 std::string, 认为 c/c++ 很不科学,完全就不是一个语言嘛. 知道4种以上c++ compiler. 感觉自己什么都会。 5 级:看山是山,看水是水。崇拜 boost source code, 呕心沥血的研究经典库的代码. 感觉自己什么都不会。 6 级:看山不是山,看水不是水。为自己钟情的函数库而奋斗着,恨不得用尽各种tricks 和 traits, 因为各种经典设计模式想得头疼. 稍有走火入魔迹象。 7 级:看山仍然山,看水仍然是水。 看到每行代码,都是汇编的指令和内存数据的移动。 代码中几乎不出现for 和 while 关键字. 不停地否定自己的过去。 8 级:维护着 g++,或者 Watcom C++ 之类的项目,头发也比较长,有艺术家气质. 9 级:参与 C++ Standards Committee, 代表不同的利益集团发言。 10级:彻底走火入魔, 成天幻想修改C++的语法, 添加自己的关键字, 重新实现一个C++的改进, 还想把c++变成脚本,解释执行.已经超越了利益。
首页 1 2 下一页