賦值兼容----只能通過這個指針訪問派生類中由基類繼承來的基類成員(虛函數能突破這個限制)

 
 
/*************************************************************/
 
#include <iostream.h>
 
class A{
private:
  //…其它成員
public:
  virtual void func(int data){cout<<”class A:”<<data<<endl;}
  void func(char *str){ cout<<”class A:”<<str<<endl; }
};
class B: public A{
//…其它成員
public:
  void func() {cout<<”function in B without parameter! \n”;}
  void func(int data) { cout<<”class B:”<<data<<endl; }
  void func(char *str){ cout<<”class B:”<<str<<endl;}
//virtual void func(int data){cout<<”class A:”<<data<<endl;}基類繼承而來的舊成員
//void func(char *str){ cout<<”class A:”<<str<<endl; }基類繼承而來的舊成員
};
int main(int argc,char *argv[])
{A a;
  A *pA;
  B b;
  pA=&b;
 pA->func(“haha”); //class A: haha //因爲不是虛函數,基類指針只能指向派生類中基類的部分,不能訪問新增
pA->func(1); //class B: 1//因爲是虛函數,突破了上面的限制。基類指針
// pA->func();正確?no,是可以將一個派生類的地址賦給基類的指針變量,但只能通過這個指針訪問派生類中由基類繼承來的基類成員,不能訪問派生類的新成員。
 a.func("hahha");//
b.func("hahha");//同名覆蓋class B:haha
a.func(1);//各過各的class A: 1
b.func(1);//各顧各的class B: 1
 
 
  return 0;
}
 
/*******************************************************************/
 
問題1:(本小題4分)在下面寫出程序的運行結果:
 問題2:(本小題2分)如下句所示,在函數main()中通過pA調用類B中定義的參數表爲空的
函數pa->func() :
是否正確? 
答:(正確/不正確)
 問題3:(本小題10分)如果要記錄已尼創建的A類的實例(對象)的個數,我們可以藉助
 於類的靜態成員。修改上面類A的定義,使得它包含一個私有的靜態成員object_count,記
 錄屬於該類的對象的個數,然後爲類A增加必要的成員函數,使得下面的程序:
 void main()
{
A *pA=new A[3];
 cout<<”There are ”<<pA->GetObjectCount()<<” objects”<<endl;
  delete []pA;
  cout<<”There are ”<<A::GetObjectCount()<<” objects”<<endl;
}
得到的輸出爲:
There are 3 objects
There are 0 objects
 下面寫出類A的定義(將所有的函數成員實現寫在類定義體中):
 在下面寫出初始化類的靜態成員object_count的語句: 
答案:
 問題1: 
答:輸出結果爲: 
class B: 1
 class A: haha
問題2:
答:不正確。
問題3:類A的定義如下:
class A{
 private:
  static object_count;
  //…其它成員
public:
  A(){ object_count++;}
  ~A(){ object_count—; }
 static int GetObjectCount(){ return object_count; }
 
//其它函數
virtual void func(int data){cout<<”class A: “<<data<<endl; }
void func(char *str){ cout<<”class A: “<<str<<endl; }
};
object_count的初始化語句如下:
int A::object_count=0;
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章