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. MAC删除目录下的“.svn”文件的方法

    http://bbs.feng.com/read-htm-tid-7803070.html MAC删除目录的“.svn”文件:打开终端,进到所在的目录,然后出入一下代码find . -name &qu ...

  2. 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---57

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  3. python接口自动化6-重定向(Location)【转载】

    本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/python%E6%8E%A5%E5%8F%A3%E8%87%AA%E5%8A%A8%E ...

  4. Jekyll搭建个人博客

    网上也有HEXO 搭建的博客,有人说使用 HEXO 在多台电脑上发布博客,操作起来并不是那么方便,所以使用Jekyll 来搭建. Jekyll配置 1,安装ruby环境 Windows系统使用Ruby ...

  5. JDK7集合框架源码阅读(二) LinkedList

    基于版本jdk1.7.0_80 java.util.LinkedList 代码如下 /* * Copyright (c) 1997, 2011, Oracle and/or its affiliate ...

  6. #422 Div2 D

    #422 Div2 D 题意 假设有 n 个人比赛,每次比赛进行分组,每组人数必须相同,如果一组有 x 人,则那一组要比赛 $ \frac{x * (x - 1)}{2}$次,最终一人获胜,其它人淘汰 ...

  7. 1.12(java学习笔记)多态及向上、向下转型

    一.多态 多态是指同一个方法被调用,由于对象不同导致行为不同. 例如调用自由活动方法,张三喜欢玩耍,那么他就会去玩耍. 李四喜欢学习,那么他可能去学习.调用方法因对象的不同 而产生了不同的行为. 形成 ...

  8. Hibernate使用Criteria去重distinct+分页

    写在前面: 最近在项目中使用了Criteria的分页查询,当查询的数据没有重复的记录还好,但是当数据有关联并出现重复记录的时候,就要去重,那么就会出现查询的记录数与实际的不一致的问题.这里也记录一下解 ...

  9. Java混乱的日志体系(logback)(转)

    作为一名 Java 程序员,日常开发工作中肯定会接触日志系统,但是众多的框架,包括 Log4j.Log4j2.Logback.Slf4j.Apache Common logging 等等,引用的 ma ...

  10. 【安居客】资深PHP软件开发工程师

    工作职责: 1.网站项目的开发和维护: 2.负责技术部软件开发架构设计: 3.负责生产环境.测试环境和生产环境服务器运维和优化: 4.负责研究较前沿和复杂的技术运用: 岗位要求: 1.熟悉 PHP 程 ...