C++指针对象的问题

来源:百度知道 编辑:UC知道 时间:2024/05/09 06:37:24
有这样一个类
class point
{
protected:
int x,y;
public:
point(int a=9,int b=9){x=a,y=b;}
void setx(){cout<<"enter point x:";cin>>x;cout<<endl;}
void sety(){cout<<"enter point y:";cin>>y;cout<<endl;}
void getx(){cout<<"this x is :"<<x<<endl;}
void gety(){cout<<"this y is :"<<y<<endl;}
};
class point2:public point
{
int z;
public:
point2(int a=7,int b=7,int c=7);
void getz(){cout<<"this z is :"<<z<<endl;}

};
point2::point2(int a,int b,int c):point(a,b),z(c){}
主函数是
#include<iostream>
using namespace std;
#include"point.h"
main()
{

point *f;

point2 h;

f=&h;
f->getz();
}
请问怎么就不能访问z呢???
不是兼容的吗?基类兼容派生类的吗?请问怎么改?

根据类的兼容性,派生类的对象可以初始化基类对象的指针,你的例子就是如此,这样可以使用基类类型的指针访问不同的派生类的对象,但实质上只能访问从派生类继承的基类子对象,对于派生类中新增加的成员则不能访问。显然getz是派生类新增的,基类中没有。
要想使用这种方法调用 point2中的getz函数则,你可以在point中增加一个getz函数,并将它设为虚函数,当然这就涉及到多态的问题了。参考程序如下:
#include<iostream>
using namespace std;

class point
{
protected:
int x,y;
public:
point(int a=9,int b=9){x=a,y=b;}
void setx(){cout<<"enter point x:";cin>>x;cout<<endl;}
void sety(){cout<<"enter point y:";cin>>y;cout<<endl;}
void getx(){cout<<"this x is :"<<x<<endl;}
void gety(){cout<<"this y is :"<<y<<endl;}
virtual void getz(){}
};
class point2:public point
{
int z;
public:
point2(int a=7,int b=7,int c=7);
void getz(){cout<<"this z is :"<<z<<endl;}

};
point2::point2(int a,int b,int c):point(a,b),z(c){}