①、可以通过基类指针访问派生类的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;
}