正文

C++继承2009-02-28 21:16:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/xman/41136.html

分享到:

1)派生方式

class <派生类名>:[派生方式]<基类名>

{

    //派生类新增成员的声明

}

    在上述派生类的定义中,“派生方式”决定了基类成员在派生类中的访问权限。派生的方式共有publicprivateprotected默认派生方式为private)。

    虽然派生类继承了基类的所有成员,但是为了不破坏基类的封装性,无论采用哪种继承方式,基类的私有(private)成员在派生类中都是不可见的,即不允许在派生类的成员函数中访问基类的私有成员。

class Point

{

private:

     int prt;

public:

     void setPrt(int t)

     {

         prt=t;

     }   

public:

     void getPrt()

     {

         std::cout<<prt;

     }   

};

class Circle:public Point

{

public:

     void visitPrt()

     {

         std::cout<<prt; //提示出错

getPrt();//利用基类封装的公有接口间接访问基类私有成员

     }   

};

    上述代码中Point类定义了private:  int prt;则在派生类Circle的成员函数visitPrt ()中企图访问继承自基类的prt,将提示error C2248: 'Point::p' cannot access private member declared in class 'Point'一般在基类中定义公有的成员函数setPrt()/getPrt()(在很多面向对象语言中成为属性)用于访问私有成员,在派生类中只能调用该接口对基类私有成员进行间接访问,基类的私有成员对于派生类可看作“只”继承了基类对私有成员封装操作的接口。

    public公有派生是类继承中最常见的派生方式。采用公有派生,基类成员的访问权限在派生类中保持不变,即基类的所有公有或保护成员在派生类中仍为公有或保护成员。这样就可以在派生类的成员函数中访问基类原有的非私有成员,并能通过派生类的对象直接访问基类原来的公有成员。

    private私有派生,基类所有的公有和保护成员在派生类中都成有私有成员,即只允许在派生类的成员函数中访问基类原有的非私有成员,不能通过派生类的对象直接访问基类的任何成员。这种派生方式很少使用。

    protected保护派生,基类所有的公有和保护成员在派生类中都成为保护成员,即只允许在派生类的成员函数和该派生类的派生类的成员函数中访问基类原有的非私有成员,也不能通过派生类的对象直接访问基类的任何成员。

2)基类和派生类的构造函数

当程序创建一个派生类对象时,系统首先自动创建一个基类对象,即在调用派生类的构

造函数构建派生对象时,系统首先调用基类的构造函数构建基类对象。当派生类的生存期结束时,析构函数的调用顺序与构造函数相反,即调用派生类的析构函数,然后调用基类的析构函数。即创建派生类对象时,先调用基类构造函数创建基类对象完成继承部分的创建(生皮),然后调用派生类的构造函数创建派生类对象完成自身的扩充发展(长毛);而派生类对象销毁时,恰恰相反,先调用派生类的析构函数(脱毛),然后调用基类的析构函数(蜕皮)

通过派生类的构造函数调用基类的构造函数有隐式和显式两种方式:

<1>隐式方式:在派生类中不指定对应的基类构造函数,这时调用的是基类的默认构造函数。

<2>显式方式:在派生类中指定要调用的基类构造函数,并将派生类构造函数的部分参数值传递给基类的构造函数。

除非基类有默认的构造函数,否则必须采用显式调用方式,即派生类必须具有一个给基类构造函数提供参数表的构造函数。

B::B(<形参声明>)A(<参数表>)//B:A

{

    //B构造函数实现代码

}

class Point

{

protected:

     int x,y;

public:

     Point(int a=0,int b=0)//含有默认参数值的构造函数也是默认的构造函数

     {

         x=a;y=b;

     }

};

class Circle:public Point

{

protected:

     int radius;

public:

     Circle(int a=0,int b=0,int r=0):Point(a,b)//显示调用基类的构造函数

     {

         radius=r;

     }

};

    分析:上述代码中类Circle除了自定义的成员radius外,还有继承自基类Point的成员xy

派生类Circle的构造函数Circle(int a=0,int b=0,int r=0):Point(a,b)a=0,b=0赋给基类Point构造函数的参数a,b。在创建Circle对象实例时,首先调用基类构造函数初始化a,b,然后再调用派生类Circle的构造函数代码。

    若派生类Circle的构造函数声明为Circle(int a=1,int b=2,int r=0):Point(a,b),则构建的是一个圆心为(12),半径为r的圆。

    参考《继承本质论》

阅读(3187) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册