继承机制的两个特性:多态+动态绑定

来源:互联网 发布:linux服务器配置方案 编辑:程序博客网 时间:2024/05/17 04:06
多态:
     基类的指针或者引用可以指向任何派生类对象的能力;(一般类型而言不允许,因为C++强类型语言,其他只有静态类型一说,对于指针和引用具有静态类型和动态类型两个方面)
动态绑定:
   
1。(和虚拟函数永不分家,配合才能实现)
         
派生类存在一个函数,而基类无,则此时未建立虚拟函数机制,即使指针,或引用的动态类型是派生类类型,也并不能调用,一句话,没有虚拟函数存在,动态类型也就不存在,一切都以静态类型(象普通的类型检查一样)为准
    2。根据指针或者引用所指向的实际对象类型(指针,引用的动态类型),来调用合适的虚拟成员函数
         (当并非虚拟函数的时候,即使指针的动态类型是派生类,由于并无虚拟机制的支持,此时也不能实现动态绑定,而只能根据当时指针引用的静态类型,调用静态类型的成员函数)

虚拟函数机制未建立,一切以静态类型执行
class B
{
public:
    B(){}
    void ok(){cout << "B::ok()" << endl;}
};

class D1:public B
{
public:
    D1(){}
    void ok(){cout << "D1::ok()" << endl;}
};

int main()
{
    B b;
    B *p = &b;
    p -> ok();
    D1 d1;
    p = &d1;
    p -> ok();
    return 0;
}


成员函数分为:
1。建立虚拟机制的(动态类型存在,进行动态绑定,如ok()函数)
2。未建立虚拟机制的(动态类型此时未建立,一切以静态类型执行,如d1_ok()函数)
class B
{
public:
    B(){}
    virtual void ok(){cout << "B::ok()" << endl;}
};

class D1:public B
{
public:
    D1(){}
    void ok(){cout << "D1::ok()" << endl;}
    void d1_ok(){cout << "D1::d1_ok()" << endl;}
};

int main()
{
    B b;
    B *p = &b;
    p -> ok();
    D1 d1;
    p = &d1;
    p -> ok();
    p -> d1_ok();
    return 0;
}

派生类继承基类的所有成员,私有成员也继承过来了,所以尺寸只大不小,只是并不能直接访问,即使通过派生类的成员函数,同样也不能访问
(可以这么理解:
派生类的成员函数只能访问
1。自己加进来的成员,无所谓什么权限;
2。从基类继承来的非私有成员,而从基类继承来的私有成员,只能通过基类成员函数访问

class B
{
public:
    B(){a = 3;}
    virtual void ok(){cout << "B::ok()" << endl;}
    int get(){return a;}
    virtual void vget(){}
private:
    int a;
};

class D1:public B
{
public:
    D1(){}
    void ok(){cout << "D1::ok()" << endl;}
    void d1_ok(){cout << "D1::d1_ok()" << endl;}
    virtual void vget(){cout << B::get() << endl;}
};

int main()
{
    B b;
    B *p = &b;
    p -> ok();
    D1 d1;
    p = &d1;
    p -> ok();
    cout << p -> get() << endl;
//    p -> d1_ok();
    p -> vget();
    return 0;
}
原创粉丝点击