6.2派生控制 类的私有成员可以被类自身的成员 和友元访问,但不能被包括派生类在内 的其他任何类和任何普通函数访问; 类的保护成员除了可以被类自身的 成员和友元访问外,还可以被派生类的 函数成员访问,但是,类的保护成员不 能被任何非友元的普通函数访问; 类的公有成员可以被任何普通函数 和任何函数成员访问
6.2派生控制 类的私有成员可以被类自身的成员 和友元访问,但不能被包括派生类在内 的其他任何类和任何普通函数访问; 类的保护成员除了可以被类自身的 成员和友元访问外,还可以被派生类的 函数成员访问,但是,类的保护成员不 能被任何非友元的普通函数访问; 类的公有成员可以被任何普通函数 和任何函数成员访问
6.2派生控制 由此可知,派生类函数成员可以访 问基类的保护和公有成员。除非定义为 基类的成员友元,否则派生类函数成员 不能访问基类的私有成员 ■例题:指出下面程序的错误
6.2派生控制 由此可知,派生类函数成员可以访 问基类的保护和公有成员。除非定义为 基类的成员友元,否则派生类函数成员 不能访问基类的私有成员。 例题:指出下面程序的错误
class LOCATION ■ class POINT:public int x; LOCATION protected:int y; int visible; public: ■ public: int getx(){return x; int isvisible(return int gety(){return y; visible;} void moveto(int x,int y) ■ void show(){visible=1; void hide()visible=0;} LOCATION:X=X; void offset(int dx,int dy) LOCATION:y=y; ■ int v=isvisible(); } if(v)hide(); LOCATION(intx,inty) ■ x+=dx; y+=dy; LOCATION:x=x; if(v)show() LOCATΠION:y=yi ■ POINT(int x,int LOCATION(} y):LOCATION(X,y) visible=0;} ■ ~POINT(){hide();}
class LOCATION{ int x; protected: int y; public: int getx( ) { return x; } int gety( ) { return y; } void moveto(int x, int y) { LOCATION::x=x; LOCATION::y=y; } LOCATION(int x, int y) { LOCATION::x=x; LOCATION::y=y; } ~LOCATION( ){ } }; class POINT: public LOCATION{ int visible; public: int isvisible( ) { return visible; }; void show( ){ visible=1; } void hide( ){ visible=0; } void offset(int dx, int dy){ int v=isvisible( ); if(v) hide( ); x += dx; y += dy; if(v) show( ); } POINT(int x, int y) :LOCATION(x, y) { visible=0; }; ~POINT( ) { hide( ); }; };
■ void main(void) ▣{ ■ POINT p(3,6); ■ p.LOCATION:moveto(7,8); ■ p.x=10; ■ p.y=20; }
void main(void) { POINT p(3, 6); p.LOCATION::moveto(7, 8); p.x = 10; p.y = 20; }
错误: void offset(int dx,int dy) int v=isvisible() if(v)hide() ×+三x:/x为基类的私有成员,派生类不能访问 y+=y;/y为基类的保护成员,派生类可以访问 ■ if(v)show();} void main(void) { ■ POINT p(3,6); ■ p.LOCATION:moveto(7,8); p×=10;/对象不能直接访问私有成员 py=20;/对象不能直接访问受保护成员
错误: void offset(int dx, int dy){ int v=isvisible( ); if(v) hide( ); x += dx;//x为基类的私有成员,派生类不能访问 y += dy;//y为基类的保护成员,派生类可以访问 if(v) show( ); } void main(void) { POINT p(3, 6); p.LOCATION::moveto(7, 8); p.x = 10; //对象不能直接访问私有成员 p.y = 20; //对象不能直接访问受保护成员 }