C++的继承中有趣的现象
来源:互联网 发布:魔音软件 编辑:程序博客网 时间:2024/05/29 10:10
①、可以通过基类指针访问派生类的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;
}
- C++的继承中有趣的现象
- 发现shell中一个有趣的现象
- 一个有趣的现象
- 一个有趣的现象
- hibernate的有趣现象
- 一次有趣的现象
- 一个C/C++结构体初始化有趣的现象
- C语言一些有趣的现象(例子) (译)
- MSComm控件的有趣现象
- javascript有趣的现象----函数
- 有趣的现象-斯德哥尔摩症候群
- 一个有趣的数学现象
- foreach的一个有趣现象
- javascript的几个有趣现象
- 一个有趣的现象----innodb_io_capacity
- 一个有趣的现象----innodb_io_capacity
- python中修改类定义的有趣现象
- Python 中 and 和 or 的有趣现象
- AIX bootinfo命令
- meta 的属性有两种:name和http-equiv
- 基于一个中心、四个基本点打造软件平台的经验教训分享(2/2)
- 浏览器访问web资源的过程
- 分析一种通过修改PE实现的反调试
- C++的继承中有趣的现象
- UITableView的简单使用
- apache负载均衡配置方案
- bt安装u盘最简单方法,其他都若爆了
- 支持向量机(二)
- NSURLConnection 下载数据 -- IOS(实例)
- http://www.cyqdata.com/cyqdata/article-detail-428
- Linux平台下java程序员的基本功(四)
- IOS 7 过渡之 Content Views (视图内容)