C++ Notes-Inheritance-02
继承方式 1、继承方式简介 1、不同的继承方式的影响主要体现在: (1)派生类成员对其基类成员的访问权限 (2)通过派生类对象对基类成员的访问权限 2、3种继承方式 (1)公有继承(public) (2)私有继承(private) (3)保护继承(protected) 2、公有继承(public) 1、继承的访问控制 (1)基类的public和protected成员:访问属性在派生类中保持不变 (2)基类的private成员:不可直接访问 2、访问权限 (1)派生类中的成员函数:可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员 (2)通过派生类的对象:只能访问public成员 3、Code #include <iostream>
#include <cmath>
using namespace std;
class Point { //基类Point类的定义
public: //公有函数成员
void initPoint(float x = 0,float y = 0)
{
this->x = x;
this->y = y;
}
void move(float offX,float offY)
{
x += offX;
y += offY;
}
float getX() const { return x; }
float getY() const { return y; }
private: //私有数据成员
float x,y;
};
class Rectangle: public Point { //派生类定义部份
public: //新增公有函数成员
void initRectangle(float x,float y,float w,float h)
{
initPoint(x,y); //调用基类公有成员函数
this->w = w;
this->h = h;
}
float getH() const { return h; }
float getW() const { return w; }
private: //新增私有数据成员
float w,h;
};
int main() {
Rectangle rect; //定义Rectangle类的对象
rect.initRectangle(2,3,20,10); //设置矩形的数据
rect.move(3,2); //移动矩形位置
cout << "The data of rect(x,y,w,h): " << endl; //输出矩形的特点参数
cout << rect.getX() <<","<< rect.getY() << ","<< rect.getW() << ","<< rect.getH() << endl;
return 0;
} 3、私有继承(private)
1、继承的访问控制 (1)基类的public和protected成员:都以private的身份出现在派生类中 (2)基类的private成员:不可直接访问 2、访问权限 (1)派生类中的成员函数:可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员 (2)通过派生类的对象:不能直接访问从基类继承的任何成员 3、Code 值得注意的是,基类中的move函数通过私有继承到派生类后,是不能在类外使用的,如果要在类外使用,可以在派生类的public下重写1个move函数,这样在类外就能够调用了。 #include <iostream>
#include <cmath>
using namespace std;
class Point { //基类Point类的定义
public: //公有函数成员
void initPoint(float x = 0,float y = 0)
{
this->x = x;
this->y = y;
}
void move(float offX,float offY)
{
x += offX;
y += offY;
}
float getX() const { return x; }
float getY() const { return y; }
private: //私有数据成员
float x,y;
};
class Rectangle: private Point { //派生类定义部份
public: //新增公有函数成员
void initRectangle(float x,float h) {
initPoint(x,y); //调用基类公有成员函数
this->w = w;
this->h = h;
}
void move(float offX,float offY) //虽然对象不能在类外使用基类的move函数,但是在派生类中可使用基类的move函数
{
Point::move(offX,offY);
}
float getX() const { return Point::getX(); }
float getY() const { return Point::getY(); }
float getH() const { return h; }
float getW() const { return w; }
private: //新增私有数据成员
float w,2); //移动矩形位置,要注意此时的move函数是派生类Rectangle中的成员函数
cout << "The data of rect(x,"<< rect.getH() << endl;
return 0;
} 4、保护继承(protected) 1、继承的访问控制 (1)基类的public和protected成员:都以protected的身份出现在派生类中 (2)基类的private成员:不可直接访问 2、访问权限 (1)派生类中的成员函数:可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员 (2)通过派生类的对象:不能直接访问从基类继承的任何成员 3、protected 成员的特点与作用(1)对建立其所在类对象的模块来讲,它与private成员的性质相同 (2)对其派生类来讲,它与public性质相同 (3)既实现了数据隐藏,又方便继承,实现代码重用 4、protected用处 如果代码是同1组,同1个团队内的人写的,那末我们可以继承使用基类protected的细节。但是如果不是同1组人写的,或是买的类库,那末使用protected的细节就不是那末方便了。 5、Code class A {
protected:
int x;
};
int main() {
A a;
a.x = 5;//毛病
}
class A {
protected:
int x;
};
class B: public A{
public:
void function();
};
void B:function() {
x = 5; //正确
} 5、多继承 如果派生类有多个基类,也就是多继承,可以用不同的方式继承每一个基类。 Code: class A {
public:
void setA(int x){ a=x; }
void showA() const{cout<<a<<endl;};
private:
int a;
};
class B {
public:
void setB(int x){ b=x; }
void showB() const{cout<<b<<endl;};
private:
int b;
};
class C : public A,private B {
public:
void setC(int x,int y,int z)
{ //派生类成员直接访问基类的公有成员
setA(x);
setB(y);
c = z;
}
void showC() const{cout<<c<<endl;};
private:
int c;
};
int main() {
C obj;
obj.setA(5);
obj.showA();
obj.setC(6,7,9);
obj.showC();
// obj.setB(6); 毛病
// obj.showB(); 毛病
return 0;
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |