OOP 3大特性:数据抽象,继承,动态绑定

3中訪问标号
protected, public, private 对照


用类进行数据抽象;用继承类继承基类的成员,实现继承。通过将基类对应函数声明为virtual,是编译器在执行时决定调用基类函数or派生类函数 完毕动态绑定。即表现多态性。
多态性:利用继承和动态绑定,通过基类指针和引用来表现。

动态绑定两个条件:1. 虚函数,2. 指针或引用

class Item_book

{

    private:

        std::string isdn;

    protected:

        double price;

    public:

        std::string book() const { return isdn; } 

};



class Bulk_item::public Item_book

{

    ...

};



void Bulk_item::memfcn(const Bulk_item &d, const Item_base &b)

{

    cout<<isdn;// error: no access to isdn which is private member in Item_base   (1)

    double ret = price; //ok: use this->price                                     (2)

    ret = d.price;// ok: use price from a Bulk_item object                       (3)

    ret = b.price; // error: no access to price from an Item_base                 (4)

}

#include <iostream>

using namespace std;

 

class Base

{   

private:

    int age;

protected:

    int num;

public:
    Base()
    {
        num = 5;
    }
    void set_num( const Base& a)

    {

        cout<<a.num<<endl;

    }

    virtual void show()

    {

        num ;

        cout<<num<<endl;

    }

};

 

class Devi : public Base

{

public:

    void show()

    {

        num ;

        cout<<num<<endl;

    }

    void test(const Base &a, const Devi &b)

    {

        cout<<b.num<<endl;  //(5)

    }

};


int main()

{

    Base b, a;

    Devi d;
    b.set_num(a);        (7)

    b.show();

    d.show();  //ok   protected  num可被子类使用

    d.test(b, d); 

    //cout<<d.num; //error  protected  num 不可被子类  对象使用 (6)



    ;

}
区分(5)(6)的差别,一个在 类的成员函数定义中(能够通过 类对象调用其保护成员。如公有成员一样)。一个在 类定义外部

总结:
訪问控制与继承:
public:
private: 仅仅能被基类的成员和友元函数訪问。不能被类的对象訪问。同一时候不能被派生类(的成员函数)訪问。例如以下(1)。
protected:能够被派生类(的成员(2))訪问。不能够被派生类对象訪问(6)。例外:(例外:在派生类内部 能够通过派生类对象訪问其基类的protected)例如以下(3)。同一时候对照下图(5)和(6);
但不能被基类的对象訪问(对于基类,相当于基类的private)例如以下(4)。基类在基类内部能够通过基类对象訪问其protected成员(7)
即 派生类能够訪问基类 protected 和 public 中的成员。

公有、私有、保护继承
对类所继承的成员的訪问由   基类的成员訪问级别和派生类派生列表中使用的訪问标号共同控制。
派生类能够进一步限制,但不能放松对继承的成员訪问。

派生类中的訪问级别(3种继承方式)
public:基类成员保持自己的訪问级别:基类的public->派生类的public,基类的protected -> 派生类的protected。 
protected:基类的public和protected成员在派生类中为proteced成员
private:基类的全部成员在派生类中为private成员。


class Base

{

public:

    void basemen();

protected:

    int i;

private:

    std::string isdn;

    ....

};

class Public_derived: public Base

{

    int use_base() { return i; } //ok: as proteced member in Public_derived

    //...

};

class Private_derived: private Base //注意。对照以下

{

    int use_base()  {return i;} // ok: i is protected member in Base, private member in Pivate_derived

    int print_isdn() {cout<<isdn; } //error: isdn is private member in Base 

};

派生訪问标号 还控制来自非直接派生类的訪问:

class Derived_from_Private: public Private_derived

{

    //error: Base::i  is private in Private_derived

    int use_base() {return i;}

};



class Derived_from_Private: public Public_derived

{

     //ok: Base::i  remain proteced in Public_derived

    int use_base() {return i;}

}

struct VS class
struct 定义的类 默认范围级别为public类型,定义的派生类 默认具有public继承
class 定义的类 默认范围级别为private类型,定义的派生类 默认具有private继承

转换与继承
能够将派生类转换为基类---通过初始化或复制。 一般调用基类的复制构造函数或赋值函数。
例:

Item_base item;                 //object of base type

Bulk_item bulk;                 //object of derived type

//ok:use Item_base::Item_base(const Item_base&) constructor

Item_base item(bulk);           // bulk is "slice down" to its Item_base portion

//ok:use Item_base::operator = (const Item_base&) 

item = bulk;                    // bulk is "slice down" to its Item_base portion


基类  不能自己主动  转换为派生类,否则派生类会訪问 不存在的成员 (基类不存在的成员)。
除非在 知道 基类向派生类转换为 安全时,能够使用 static_cast强制编译器进行转换。或是
用 dynamic_cast 申请在执行时进行检測。

參照 《C++ primer》 第15章

訪问控制 protected, public, private 对照的更多相关文章

  1. C++类訪问控制及继承

    一.C++类的訪问控制有三类:public,protected和private. 类訪问控制符 类成员可被哪些对象訪问 public 1.类的成员函数.2.类对象.3.友元.4.子类成员函数 prot ...

  2. JAVA基础之訪问控制权限(封装)

    包:库单元 1.当编写一个Java源码文件时.此文件通常被称为编译单元(有时也被称为转译单元). 2.每一个编译单元都必须有一个后缀名.java,而在编译单元内则能够有一个public类,该类名称必须 ...

  3. php訪问控制

    訪问控制通过keywordpublic,protected和private来实现. 被定义为公有的类成员能够在不论什么地方被訪问.被定义为受保护的类成员则能够被其自身以及其子类和父类訪问.被定义为私有 ...

  4. 关于Apacheserver的訪问控制

    Apache的訪问控制指对不论什么资源的不论什么方式的訪问控制. 一.基于主机或者IP地址的控制 这样的訪问控制基于訪问者的主机名或者IP地址,通过使用 Deny 和 Allow 指令.实现同意或者禁 ...

  5. Phalcon 訪问控制列表 ACL(Access Control Lists ACL)

    Phalcon在权限方面通过 Phalcon\Acl 提供了一个轻量级的 ACL(訪问控制列表). Access Control Lists (ACL) 同意系统对用户的訪问权限进行控制,比方同意訪问 ...

  6. ORA-24247: 网络訪问被訪问控制列表 (ACL) 拒绝

     ORA-24247: 网络訪问被訪问控制列表 (ACL) 拒绝 注意:须要在system用户下使用命令 须要先使用 DBMS_NETWORK_ACL_ADMIN.CREATE_ACL 创建訪问控 ...

  7. C++ 訪问控制权限图解

    基类訪问权限 类继承方式 子类訪问权限           public   public   protected public protected   private   No Access   p ...

  8. C++_类继承4-访问控制protected

    public和private来控制对类成员的访问. 还存在另外一个访问类别,这种类别用关键字protected表示.protected和private相似,在类外只能用公有类成员来访问protecte ...

  9. [Nginx]用Nginx实现与应用结合的訪问控制 - 防盗链

    应用场景:图片等资源须要设置权限,如:仅仅有认证过的用户才干訪问自己的图片. 解决的方法:使用Nginx的防盗链模块http_secure_link能够实现,该模块默认情况下不包括.故在安装时要加上- ...

随机推荐

  1. 获取URL中的文件的扩展名

    问题: 尽可能多地写出获取文件扩展名的方法: //方法一(分割数组) function getExt($url){ $arr = explode('.',$url); $len = count($ar ...

  2. python--enum

    # enum用于枚举,该模块下有一个Enum,我们定义的类要继承它 # 一旦继承,那么我们定义的key(仮),不能有重复值. # 如果要保证value(仮)不重复,那就引入unique,给我们定义的类 ...

  3. Linux使用命令记录

    1.对一个文件夹中所有的文件进行修改权限: • chmod –R 777 aa (- R 递归式改变指定目录及其所目录文件拥者) • 目录/his及其所文件目录,chown - R www.www / ...

  4. red-lang

    Red is a next-generation programming language strongly inspired by Rebol, but with a broader field o ...

  5. 数据块dump详解及大小表扫描过程

    http://blog.csdn.net/u013820054/article/details/40378233 http://blog.csdn.net/u013820054/article/cat ...

  6. iOS网络编程--ASIHTTPRequest框架安装和配置-图文解说

    ASIHTTPRequest框架是优秀的第三方Objective-C的HTTP框架,支持Mac OS X和iOS下的HTTP开发.技术支持网站是http://allseeing-i.com/ASIHT ...

  7. kubernetes1.5.2集群部署过程--非安全模式

    运行环境 宿主机:CentOS7 7.3.1611 关闭selinux etcd 3.1.9 flunnel 0.7.1 docker 1.12.6 kubernetes 1.5.2 安装软件 yum ...

  8. Unable to list target platforms. Please make sure the android sdk path is correct. See the Console for more details.

    在android上发布遇到 androidSDK无法找到的问题 http://www.jianshu.com/p/fe4c334ee9fe

  9. 面试题:如何在不使用临时变量temp的情况下交换两个整数的值?

    利用一个小技巧,一个整数a在异或另一个整数b两次以后所得的值还是整数a. 具体的过程我们可以自己找两个整数以二进制的形式自己在纸上画一下他们的异或过程.(异或的运算符号为"^") ...

  10. BeagleBone Black板第四课:简单LED控制实验

    BBB板第四课:简单LED控制实验 学习BBB板的终于目的是想像单片机一样做控制,但控制思路全然不一样(Linux下控制硬件设备实质就是对相关设备虚拟文件的读写).研究了几天头都大了还是没有进展,网上 ...