關於繼承和虛函數的問題

#include <iostream>
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的構造函數!!



發佈了17 篇原創文章 · 獲贊 2 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章