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