/*************************************************************/
#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;