父类指针在转换为子类指针的时候到底发生了什么?
父类指针在转换为子类指针的时候到底发生了什么?
class A
{
public:
void f()
{
cout<<"基类的f函数"<<endl;
}
virtual void h()
{
cout<<"基类的h函数"<<endl;
}
};
class B:public A
{
public:
void f()
{
cout<<"派生类的f函数"<<endl;
}
virtual void h()
{
cout<<"派生类的h函数"<<endl;
}
void g()
{
cout<<"派生类的g函数"<<endl;
}
};
int main()
{
A a;
B* pb = (B*)&a;
pb->f();//为什么输出派生类的f函数
pb->h();//为什么输出基类的g函数
pb->g();//为什么输出派生类的g函数
B b;
A* pa = &b;
pa->f();//为什么输出基类的f函数
pa->h();//输出派生类的h函数,这个能理解
return 0;
}
?pb->f();//为什么输出派生类的f函数
/**
*member function call编译期resolve
*pb is a pointer to class object B, call B::f()
*/
??pb->h();//为什么输出基类的g函数
/**
*virtual function call执行期resolve
* pb->vfptr[1]()
* vfptr指向A类的虚表
*/
??pb->g();//为什么输出派生类的g函数
/**
*理由和调f()一样
*/
??B?b;
??A*?pa?=?&b;
??pa->f();//为什么输出基类的f函数
/**
*virtual function call执行期resolve
* pb->vfptr[1]()
* vfptr指向B类的虚表
*/
??pa->h();//输出派生类的h函数,这个能理解
#include<iostream>
using namespace std;
class A { int a; };
class B { int b; };
class C : public A, public B { int c; };
int main()
{
C* ptr = new C();
cout<<"static_cast: "<<static_cast<A*>(ptr)<<", reinterpret_cast: "<<reinterpret_cast<A*>(ptr)<<endl;
cout<<"static_cast: "<<static_cast<B*>(ptr)<<", reinterpret_cast: "<<reinterpret_cast<B*>(ptr)<<endl;
}
把子类指针强制转换为父类指针,还可以理解,这里把父类指针转换为子类指针就理解不了啊,想象的子类的内容比父类多,父类强转子类,那子类有而父类没有的东西该怎么办。。。然后把一个完全和类无关的整形变量的地址强制转换为类指针就更理解不了了。。。
有多重继承的时候你就知道能干什么用了。