C++之继承关系

来源:互联网 发布:php时间戳转换 编辑:程序博客网 时间:2024/06/09 16:56

C++继承:公有,私有,保护
继承方式限定了基类成员在派生类中的访问权限,包括 public(公有的)、private(私有的)和 protected(受保护的)。此项是可选项,如果不写,默认为 private(成员变量和成员函数默认也是 private)。

共有继承 :
基类的public 和protected成员在派生类中保持不变,private 不可见。
保护继承:
基类的public 和protected成员在派生类中变成protected,不能被这个派生类的子类suofangwie,private 不可见。
私有继承:
基类的public 和protected成员在派生类中变成private,private 不可见。

#include<iostream>using namespace std;Class A   //父类{    privateint privateA    protected:        int protectedA    public:        int publicA}class B:public A   //基类A的派生类B(共有继承){    public:    void func()        {        int b;        b =privateA;  //error:基类中私有成员在派生类中不可用        b = protectedA; //OK:基类保护成员在派生类中为保护成员        b = publicA; //OK:基类共有成员在派生类中为共有成员         }}class C:protected A   //基类A的派生类B(保护继承){    public:    void func()        {        int c;        c =privateA;  //error:基类中私有成员在派生类中不可用        c = protectedA; //OK:基类保护成员在派生类中为保护成员        c = publicA; //OK:基类共有成员在派生类中为保护成员        }}class D:private A   //基类A的派生类B(继承){    public:    void func()        {        int b;        b =privateA;  //error:基类中私有成员在派生类中不可用        b = protectedA; //OK:基类保护成员在派生类中为私有成员        b = publicA; //OK:基类共有成员在派生类中为私有成员         }}int main(){    int a;    B objB;    a =objB.privateA;  //error:基类私有成员在派生类中不可见,对对象不可见    a=objB.protectedA; //error:基类保护成员在派生类中为保护成员,对对象不可见    a =objB.publicA;   //Ok:基类共有成员在派生类中为公共成员,对对象可见    C = objC    a =objC.privateA;  //error:基类私有成员在派生类中不可见,对对象不可见    a=objC.protectedA; //error:基类保护成员在派生类中为保护成员,对对象不可见    a =objC.publicA;   //Ok:基类共有成员在派生类中为保护,对对象不可见    D =objD;    a =objD.privateA;  //error:基类私有成员在派生类中不可见,对对象不可见    a=objD.protectedA; //error:基类保护成员在派生类中为私有成员,对对象不可见    a =objD.publicA;   //Ok:基类共有成员在派生类中为私有成员,对对象不可见    return 0;}

多态性:

(1) 解释多态性:
函数的多种不同实现方式即为多态
(2) 必要性
在继承中,有时候基类的一些函数在派生类中也是有用的,但是功能不够全或者两者的功能实现方式就是不一样的,这个时候就希望重载那个基类的函数,但是为了不再调用这个函数时,出现不知道调用基类的还是子类的情况出现,于是就提出了多态。如果语言不知多态,则不能称为面向对象的。
(3) 实现(虚函数 virtual)
多态是实现是依赖于虚函数来实现的,之所以虚函数可以分清楚当前调用的函数是基类的还是派生类的,主要在于基类和派生类分别有着自己的虚函数表,再调用虚函数时,它们是通过去虚函数表去对应的函数的。

#include<iostream>using namespace std;class A{public:    void print()    {    cout<<"A"<<endl;    }    virtual void print1()    {    cout<< "virtual A"<<endl;    }};class B:public A{public :    void print() {cout<<"B"<<endl;}    virtual void print1() {cout<<"virtual B"<<endl;}};  void fn(A &s){s.print();s.print1();}int main(){    A a;    B b;    fn(a);    fn(b);    return 0;}

五、使用虚函数的一些限制
(1):只有类成员函数才能声明为虚函数,这是因为虚函数只适用于有继承关系的类对象中。
(2):静态成员函数不能说明为虚函数,因为静态成员函数不受限与某个对象,整个内存中只有一个,所以不会出现混淆的情况
(3):内联函数不可以被继承,因为内联函数是不能子啊运行中动态的确认其位置的。
(4):构造函数不可以被继承。
(5):析构函数可以被继承,而且通常声明为虚函数。

六、纯虚函数
纯虚函数声明:virtual 返回值类型成员函数名(参数表)=0;
含有纯虚函数的类为抽象类,它不能生成对象。