using namespace std;
class A
{
public:
A()
{ a = 1;b = 2;}
~A()
{}
virtual void fun()
{ printf("%d %d\n",a,b);
cout<<"A fun;"<<endl;
}
int a;
int b;
};
class B: public A
{
public:
B()
{ c = 3;}
~B()
{}
void fun()
{
printf("%d\n",c);
cout<<"B fun;"<<endl;
}
int c;
};
int main()
{
A oba;
B *pb = (B*)(&oba);
pb->fun();
B obj;
A *pa = (A*)(&obj);
pa->fun();
system("pause");
return 0;
}
解析:
當類A中的函數是虛函數時:
B *pb = (B*)(&oba);
這裏僅僅是對類型進行裝換和對象的構造無關,由於虛函數指針依附對象存在,所以輸出的值任然是虛函數的值。
當類A中的函數不是虛函數時:
B *pb = (B*)(&oba);
這裏會輸出對象的當前值,但是由於類B繼承類A,所以輸出類B中輸出C的值是不能確定的是一個隨機值。
原因是類B強制裝換位類A時沒又掉用類B的構造函數,而只調用了類A的構造函數!!