原文: http://blog.csdn.net/zgjxwl/article/details/4804233

1.public继承方式下

#include <iostream>  
using namespace std;  
class Animal  
{  
public:  
    Animal(){}  
    void eat()  
    {  
        cout << "eat\n";  
    }  
protected:  
    void play()  
    {  
        cout << "play\n";  
    }  
private:  
    void drink()  
    {  
        cout << "drink\n";  
    }  
};  
class Giraffe: public Animal  
{  
public:  
    Giraffe(){}  
    void StrechNeck()  
    {  
        cout << "Strech neck \n";  
    }  
    void take()  
    {  
        eat();      // ok,公有继承下,基类的公有成员对派生类可见  
//      drink();    // error,公有继承下,基类的私有成员对派生类不可见,也就是说,派生类不能访问基类私有成员  
        play();     // ok,公有继承下,基类的保护成员对派生类可见  
    }  
};  
 
 
int main()  
{  
    Giraffe gir;  
    // 以下三条语句说明基类成员对派生类对象的可见性  
    gir.eat();              // ok,公有继承下,基类的公有成员对派生类对象可见  
    // gir.play();                  // error,公有继承下,基类的保护成员对派生类对象不可见  
    // gir.drink();                     // error,公有继承下,基类的私有成员对派生类对象不可见  
      
    // 下面一条语句说明基类成员对派生类的可见性  
    // 派生类(即对派生类的成员函数,派生类的友元函数和有元类可见性,和派生类对象无关)  
    gir.take();   
      
    gir.StrechNeck();  
    return 0;  

#include <iostream>
using namespace std;
class Animal
{
public:
 Animal(){}
 void eat()
 {
  cout << "eat\n";
 }
protected:
 void play()
 {
  cout << "play\n";
 }
private:
 void drink()
 {
  cout << "drink\n";
 }
};
class Giraffe: public Animal
{
public:
 Giraffe(){}
 void StrechNeck()
 {
  cout << "Strech neck \n";
 }
 void take()
 {
  eat();  // ok,公有继承下,基类的公有成员对派生类可见
//  drink(); // error,公有继承下,基类的私有成员对派生类不可见,也就是说,派生类不能访问基类私有成员
  play();  // ok,公有继承下,基类的保护成员对派生类可见
 }
};

int main()
{
 Giraffe gir;
 // 以下三条语句说明基类成员对派生类对象的可见性
 gir.eat();    // ok,公有继承下,基类的公有成员对派生类对象可见
 // gir.play();           // error,公有继承下,基类的保护成员对派生类对象不可见
 // gir.drink();                  // error,公有继承下,基类的私有成员对派生类对象不可见
 
 // 下面一条语句说明基类成员对派生类的可见性
 // 派生类(即对派生类的成员函数,派生类的友元函数和有元类可见性,和派生类对象无关)
 gir.take(); 
 
 gir.StrechNeck();
 return 0;
}

2.private继承方式下

#include <iostream>  
using namespace std;  
class Animal  
{  
public:  
    Animal(){}  
    void eat()  
    {  
        cout << "eat\n";  
    }  
protected:  
    void play()  
    {  
        cout << "play\n";  
    }  
private:  
    void drink()  
    {  
        cout << "drink\n";  
    }  
};  
class Giraffe: private Animal  
{  
public:  
    Giraffe(){}  
    void StrechNeck()  
    {  
        cout << "Strech neck \n";  
    }  
    void take()  
    {  
        eat();      // ok,私有继承下,基类的公有成员对派生类可见  
//      drink();    // error,私有继承下,基类的私有成员对派生类不可见,也就是说,派生类不能访问基类私有成员  
        play();     // ok,私有继承下,基类的保护成员对派生类可见  
    }  
};  
 
 
int main()  
{  
    Giraffe gir;  
    // 以下三条语句说明基类成员对派生类对象的可见性  
//  gir.eat();          // error,私有继承下,基类的公有成员对派生类对象不可见  
//  gir.play();         // error,私有继承下,基类的保护成员对派生类对象不可见  
//  gir.drink();                // error,私有继承下,基类的私有成员对派生类对象不可见  
 
    // 下面一条语句说明基类成员对派生类的可见性  
    // 派生类(即对派生类的成员函数,派生类的友元函数和有元类可见性,和派生类对象无关)  
    gir.take();   
 
    gir.StrechNeck();  
    return 0;  

#include <iostream>
using namespace std;
class Animal
{
public:
 Animal(){}
 void eat()
 {
  cout << "eat\n";
 }
protected:
 void play()
 {
  cout << "play\n";
 }
private:
 void drink()
 {
  cout << "drink\n";
 }
};
class Giraffe: private Animal
{
public:
 Giraffe(){}
 void StrechNeck()
 {
  cout << "Strech neck \n";
 }
 void take()
 {
  eat();  // ok,私有继承下,基类的公有成员对派生类可见
//  drink(); // error,私有继承下,基类的私有成员对派生类不可见,也就是说,派生类不能访问基类私有成员
  play();  // ok,私有继承下,基类的保护成员对派生类可见
 }
};

int main()
{
 Giraffe gir;
 // 以下三条语句说明基类成员对派生类对象的可见性
// gir.eat();   // error,私有继承下,基类的公有成员对派生类对象不可见
// gir.play();   // error,私有继承下,基类的保护成员对派生类对象不可见
// gir.drink();          // error,私有继承下,基类的私有成员对派生类对象不可见

// 下面一条语句说明基类成员对派生类的可见性
 // 派生类(即对派生类的成员函数,派生类的友元函数和有元类可见性,和派生类对象无关)
 gir.take();

gir.StrechNeck();
 return 0;
}

3.protected继承方式下

#include <iostream>  
using namespace std;  
class Animal  
{  
public:  
    Animal(){}  
    void eat()  
    {  
        cout << "eat\n";  
    }  
protected:  
    void play()  
    {  
        cout << "play\n";  
    }  
private:  
    void drink()  
    {  
        cout << "drink\n";  
    }  
};  
class Giraffe: protected Animal  
{  
public:  
    Giraffe(){}  
    void StrechNeck()  
    {  
        cout << "Strech neck \n";  
    }  
    void take()  
    {  
        eat();      // ok,保护继承下,基类的公有成员对派生类可见  
//      drink();    // error,保护继承下,基类的私有成员对派生类不可见,也就是说,派生类不能访问基类私有成员  
        play();     // ok,保护继承下,基类的保护成员对派生类可见  
    }  
};  
 
 
int main()  
{  
    Giraffe gir;  
    // 以下三条语句说明基类成员对派生类对象的可见性  
    //  gir.eat();          // error,保护继承下,基类的公有成员对派生类对象不可见  
    //  gir.play();         // error,保护继承下,基类的保护成员对派生类对象不可见  
    //  gir.drink();        // error,保护继承下,基类的私有成员对派生类对象不可见  
      
    // 下面一条语句说明基类成员对派生类的可见性  
    // 派生类(即对派生类的成员函数,派生类的友元函数和有元类可见性,和派生类对象无关)  
    gir.take();   
      
    gir.StrechNeck();  
    return 0;  
}

C++中public/private/protected三种继承方式下基类成员对派生类的可见性探讨相关推荐

  1. 类的继承(三种继承方式)

    我只是挑着我不太会的地方整理,可能比较基础. 类的继承主要分为三类,公有继承,私有继承,保护继承. 然后主要记录一下不同的继承方法对派生类的不同作用. 1,派生类私有继承于基类. 这个时候,派生类继承 ...

  2. protect 继承_c++三种继承方式public,protect,private

    三种访问权限 public:可以被任意实体访问 protected:只允许子类及本类的成员函数访问 private:只允许本类的成员函数访问 三种继承方式 public 继承 protect 继承 p ...

  3. PHP Class中public,private,protected,static的区别

    PHP Class中public,private,protected,static的区别 public:权限是最大的,可以内部调用,实例调用,可以被继承. protected:受保护类型,用于本类和继 ...

  4. php class中public,private,protected的区别以及实例分析

    本篇文章是对php class中public,private,protected的区别以及实例进行了详细的分析介绍,需要的朋友参考下 一,public,private,protected的区别 pub ...

  5. C++继承机制(一)——基本语法、三种继承方式、继承哪些数据

    目录: C++继承机制(一)--基本语法.三种继承方式.继承哪些数据 C++继承机制(二)--继承中的构造和析构顺序.继承同名成员的处理方式 C++继承机制(三)--多继承.菱形继承.虚继承原理 本篇 ...

  6. protect 继承_C++三种继承方式

    C++继承的一般语法为: class 派生类名:[继承方式] 基类名{ 派生类新增加的成员 }; 继承方式限定了基类成员在派生类中的访问权限,包括 public(公有的).private(私有的)和 ...

  7. C++的三种继承方式详解

    文章目录 @[toc] C++的三种继承方式详解以及区别 前言 一.public继承 二.protected继承 三.private继承 四.三者区别 五.总结 后话 C++的三种继承方式详解以及区别 ...

  8. C++ 三种继承方式

    C++继承的一般语法为: class 派生类名:[继承方式] 基类名{派生类新增加的成员 }; 继承方式限定了基类成员在派生类中的访问权限,包括 public(公有的).private(私有的)和 p ...

  9. Java中List集合的三种遍历方式(全网最详)

    Map集合:链接: Map集合的五种遍历方式及Treemap方法 Set集合:链接: Java中遍历Set集合的三种方法 TreeSet集合:链接: Java深入了解TreeSet,和迭代器遍历方法 ...

最新文章

  1. Go 分布式学习利器(12)-- Go语言的扩展和复用
  2. LeetCode 2 两数相加
  3. 10个强大的Javascript表单验证插件推荐
  4. 20155338 《网络攻防》 Exp7 网络欺诈防范
  5. 【控制】《复杂运动体系统的分布式协同控制与优化》-方浩老师-第10章-基于模型预测控制的人机协同控制
  6. JVM:类加载机制之类加载器
  7. java制作图形界面数据库_java图形界面以及链接数据库
  8. 不错的向上滚动广告代码
  9. 华为服务器报错信息,厂商 push 不通排查指南
  10. JAVA中易出错的小问题(二)
  11. python绘制缓和曲线_CAD中如何绘制缓和曲线
  12. 导出java applet_Java Applet基础——输出HelloWorld
  13. 国产统信UOS使用FTP跨网段访问桌面云神州网信版windows的共享文件
  14. jquery mobile mobiscroll 日期插件使 用mobiscroll
  15. POJ 1417 True Liars (种类并查集+DP)
  16. ELK+Filebeat 部署安装
  17. PAT_(STL使用)map-1100 Mars Numbers (20分)-1054 The Dominant Color (20分)-1071-1022
  18. 命运2服务器维护2021,命运2 2021年3月17日更新内容详解 冰影系列削弱一览[多图]...
  19. 《带你学C带你飞》—— SE44传递结构体变量和结构体指针
  20. iOS常用第三方框架

热门文章

  1. create-react-app中配置antd按需加载、less、proxy、路径别名
  2. 纳尼?我的Gradle build编译只要1s
  3. 移动数据库 Realm 在 React-Native 的使用详解
  4. Hadoop(八)Java程序访问HDFS集群中数据块与查看文件系统
  5. 网页登陆注册(jsp实现)验证码
  6. 9.思科交换路由基本命令操作
  7. Windows Server 2008 Active Directory的安装
  8. Windows2003四大必知版本
  9. 微信扫码登录实现原理
  10. react with form