基类的protected成员

2014-07-27 星期日 18:10:56

重温下c++ primer,随意记录。

1、基类protected成员

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

#include <iostream>

#include <iterator>

#include <vector>

#include <algorithm>

#include <utility>

#include <string>

using namespace std;

/*

如果没有继承,

类只有两种用户:

1:类本身的成员

2:类的用户(instance或有效的ptr&ref)

有继承

3:derive:public/protected/private均可

derive可以访问base protected,不可以访问base private

希望禁止derive访问的成员应该设为 private

希望提供derive实现所需方法或数据的成员应设为 protected。

所以

base提供给derive的接口应该是

protected 成员和 public 成员的组合。

*/

class base

{

public:

    base():m_base(3){}

    virtual ~base(){}

    

protected:

    int m_base;

};

class derive:private base

{

public:

    derive():m_derive(4){}

public:

    void access(const base& refb, const derive& refd)

    {

        /*

        此外,protected 还有另一重要性质:

        派生类只能通过派生类对象访问其基类的 protected 成员,

        派生类对其基类类型对象的 protected 成员没有特殊访问权限。

        */

        //cout << "refb.m_base  : "<< refb.m_base<< endl;

        /*

        15.2.2. protected 成员

        可以认为 protected 访问标号是 private 和 public 的混合:

        .像 private 成员一样,protected 成员不能被类的用户访问。

        .像 public  成员一样,protected 成员可被该类的派生类访问。

        */

        cout << "refd.m_base  : "<< refd.m_base<< endl;

        cout << "refd.m_derive: "<< refd.m_derive<< endl;

    }

protected:

    int m_derive;

};

int main (int argc,char *argv[])

{

#if 1

    base b;

    base *pb = new base();

    //cout << "m_base  : "<< b.m_base<< endl;

    derive d;

    d.access(b, d);

#endif

    return 0;

}

?

基类的protected成员,布布扣,bubuko.com

时间: 2024-10-07 00:32:46

基类的protected成员的相关文章

第十二周阅读程序4:虚拟基类-同名数据成员

问题及代码: (1)程序执行后,运行结果是多少? (2)将程序中有注释的两条语句修改为注释的内容,即将"class B:public A {};"修改为"class B:virtual public A{};","class C:public A {}; "修改为"class C:virtual public A{};",重新编译运行程序,程序的运行结果又是多少? #include<iostream> using

类的集成,对基类私有成员的访问

派生类不能直接访问基类的私有成员,若要访问必须使用基类的接口,即通过其成员函数.实现方法有如下两种: 1.在基类的声明中增加保护成员,将基类中提供给派生类访问的私有成员定义为保护成员.2.将需要访问基类私有成员的派生类成员函数声明为友元. #include<iostream> using namespace std; class Base {       friend class Derived2;//friend       int x;       protected://protecte

C++ Primer 学习笔记_65_面向对象编程 --概述、定义基类和派生类

面向对象编程 --概述.定义基类和派生类 引言: 面向对象编程基于的三个基本概念:数据抽象.继承和动态绑定. 在C++中,用类进行数据抽象,用类派生从一个类继承另一个:派生类继承基类的成员.动态绑定使编译器能够在运行时决定是使用基类中定义的函数还是派生类中定义的函数. 继承和动态绑定在两个方面简化了我们的程序:[继承]能够容易地定义与其他类相似但又不相同的新类,[派生]能够更容易地编写忽略这些相似类型之间区别的程序. 面向对象编程:概述 面向对象编程的关键思想是多态性(polymorphism)

C++ Primer 学习笔记_65_面向对象编程 -概述、定义基类跟派生类

面向对象编程 --概述.定义基类和派生类 引言: 面向对象编程基于的三个基本概念:数据抽象.继承和动态绑定. 在C++中,用类进行数据抽象,用类派生从一个类继承另一个:派生类继承基类的成员.动态绑定使编译器能够在运行时决定是使用基类中定义的函数还是派生类中定义的函数. 继承和动态绑定在两个方面简化了我们的程序:[继承]能够容易地定义与其他类相似但又不相同的新类,[派生]能够更容易地编写忽略这些相似类型之间区别的程序. 面向对象编程:概述 面向对象编程的关键思想是多态性(polymorphism)

C++ Primer 学习笔记_66_面向对象编程 -定义基类跟派生类[续]

面向对象编程 --定义基类和派生类[续] 四.virtual与其他成员函数 C++中的函数调用默认不使用动态绑定.要触发动态绑定,必须满足两个条件: 1)只有指定为虚函数的成员函数才能进行动态绑定,成员函数默认为非虚函数,非虚函数不进行动态绑定. 2)必须通过基类类型的引用或指针进行函数调用. 1.从派生类到基类的转换 因为每个派生类对象都包含基类部分,所以可以将基类类型的引用绑定到派生类对象的基类部分可以用指向基类的指针指向派生类对象: void print_total(const Item_

子类继承基类的三种继承方式

在C++中,子类继承父类有三种继承方式,分别是:public, protected和private.子类继承的方式不同,那么子类对象访问父类中的参数访问权限也不同. public 方式继承:基类的private成员派生类不可见,基类中的protected和public成员在派生类中可以直接使用,并且变成了派生类中相应                        的protected成员和public成员,但是只有public成员可以在派生类外使用. protected 方式继承:基类的priv

c++中派生类对基类成员的三种访问规则(转)

C++中派生类对基类成员的访问形式主要有以下两种:1.内部访问:由派生类中新增成员对基类继承来的成员的访问.2.对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问.今天给大家介绍在3中继承方式下,派生类对基类成员的访问规则. 1.私有继承的访问规则当类的继承方式为私有继承时,基类的public成员和protected成员被继承后成为派生类的private成员,派生类的其它成员可以直接访问它们,但是在类的外部通过派生类的对象无法访问.基类的private成员在私有派生类中是不可直接

C#继承机制 访问与隐藏基类成员

(1) 访问基类成员 通过base 关键字访问基类的成员:   调用基类上已被其他方法重写的方法.  指定创建派生类实例时应调用的基类构造函数.  基类访问只能在构造函数.实例方法或实例属性访问器中进行. 从静态方法中使用 base 关键字是错误的. 示例:下面程序中基类 Person 和派生类 Employee 都有一个名为 Getinfo 的方法.通过使用 base 关键字,可以从派生类中调用基类上的 Getinfo 方法. using System ;public class Person

java反射获取类的所有成员变量(本类和基类)

我们知道在Java的反射机制中,最核心的一个类就是Class类. Class类中提供了两个常用的获取类的成员变量的方法. 方法1 getFields() /** * Returns an array containing {@code Field} objects reflecting all * the accessible public fields of the class or interface represented by * this {@code Class} object. *