父类子类指针相互转换
1.当自己的类指针指向自己类的对象时,无论调用的是虚函数还是实函数,其调用的都是自己的:
2.当指向父类对象的父类指针被强制转换成子类指针时候,子类指针调用函数时,只有非重写函数是自己的,虚函数是父类的;
3.当指向子类对象的子类指针被强制转换成父类指针的时候,也就是父类指针指向子类对象,此时,父类指针调用的虚函数都是子类的,而非虚函数都是自己的;
当父类子类有同名非虚函数的时候,调用的是转换后的指针类型的函数;
当父类子类有同名虚函数的时候,调用的是指针转换前指向的对象类型的函数。
class A
{
public:
virtual void foo(){std::cout<<"A"<<std::endl;}
void nfoo(){std::cout<<"non virtual A"<<std::endl;}
};
class B :public A
{
public:
virtual void foo(){std::cout<<"B"<<std::endl;}
void nfoo(){std::cout<<"non virtual B"<<std::endl;}
};
int main()
{
A *pa=new A;
B *pb=(B*)pa;
pb->foo();
pb->nfoo();
B *ppb=new B;
A *ppa=(A*) ppb;
ppa->foo();
ppa->nfoo();
return 0;
}
output
A
non virtual B
B
non virtual A