我是C++菜鸟,刚学了一点C++。

先看例子1:

/* Item.h */

#include <iostream>

#include <string>

class
Item_base
{

public:

Item_base(const
std::string
&book
=
"",

double
sales_price
=
0.0)
:

isbn(book),
price(sales_price)
{}

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

bool
isPrecious(Item_base
&other);

 

virtual
double
net_price(std::size_t
n)
const

{
return
n*price;
}

virtual
~Item_base()
{}

 

private:

std::string
isbn;

double
price;

};

 

 

/* Item.cc */

#include "Item.h"

bool
Item_base::isPrecious(Item_base
&other)

{

if(price
>
other.price)

return
true;

return
false;

}

 

 

/* test.cc */

#include "Item.h"

using
std::cout;

using
std::endl;

int
main()

{

Item_base
base("TN-119",12.3);

cout
<<"isbn: "
<<base.book()
<<endl;

 

double
total_price
=
base.net_price(3);

cout
<<"total: "
<<total_price
<<endl;

 

Item_base
base1("TN-120",15.4);

if(base.isPrecious(base1))

cout
<<base.book()
<<" is precious than "
<<base1.book()
<<endl;

else

cout
<<base.book()
<<" is cheaper than "
<<base1.book()
<<endl;

return
0;

}

 

    在没有继承的情况下,只要public、private就足够了,private成员不能被用户(test.cc)使用,用户只能通过类的public接口来使用它们,比如用base.book()来获得base.isbn。

    在类中,该类(不是该类的一个对象,而是该类的任何对象)的private成员都可以被访问,如bool Item_base::isPrecious(Item_base &other)函数中,就可以访问Item_base类的price成员,当然成员的访问要依赖于具体的对象,如这里的this、other。

 

 

/* Item.h */

#include <iostream>

#include <string>

class
Item_base
{

public:

Item_base(const
std::string
&book
=
"",

double
sales_price
=
0.0)
:

isbn(book),
price(sales_price)
{}

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

bool
isPrecious(Item_base
&other);

 

virtual
double
net_price(std::size_t
n)
const

{
return
n*price;
}

virtual
~Item_base()
{}

 

private:

std::string
isbn;

double
price;

};

 

class
Bulk_item
:
public
Item_base
{

public:

Bulk_item(std::size_t
min,
double
disc_rate)
:

min_qty(min),
discount(disc_rate)
{}

Bulk_item(const
std::string
&book,
double
sales_price,

std::size_t
min,
double
dis)
:

Item_base(book,sales_price),
min_qty(min),
discount(dis)
{}

 

private:

std::size_t
min_qty;

double
discount;

};

 

 

/* Item.cc */

#include "Item.h"

bool
Item_base::isPrecious(Item_base
&other)

{

if(price
>
other.price)

return
true;

return
false;

}

 

 

/* test.cc */

#include "Item.h"

using
std::cout;

using
std::endl;

int
main()

{

Item_base
base("TN-119",12.3);

Bulk_item
bulk("TNP-132",13.3,3,0.2);

 

if(base.isPrecious(bulk))

cout
<<base.book()
<<" is more expensive than "
<<bulk.book()
<<endl;

if(bulk.isPrecious(base)) //ok! isPrecious is base's func, it can access base's data

cout
<<base.book()
<<" is cheaper than "
<<bulk.book()
<<endl;

 

return
0;

}

 

    Bulk_item类继承了Item_base类,并从哪里继承了bool
isPrecious(Item_base
&other)方法,但要注意该方法仍然是基类定义的,只是被子类继承过来用而已。再看test.cc中的base.isPrecious(bulk)调用,该实参被自动转化为Item_base类,isPrecious()函数仍可以访问bulk从基类那继承来的private成员price。

 

 

    最后看一下例子3:

/* Item.h */

#include <iostream>

#include <string>

class
Item_base
{

public:

Item_base(const
std::string
&book
=
"",

double
sales_price
=
0.0)
:

isbn(book),
price(sales_price)
{}

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

bool
isPrecious(Item_base
&other);

 

virtual
double
net_price(std::size_t
n)
const

{
return
n*price;
}

virtual
~Item_base()
{}

 

private:

std::string
isbn;

protected:

double
price;

};

 

class
Bulk_item
:
public
Item_base
{

public:

Bulk_item(std::size_t
min,
double
disc_rate)
:

min_qty(min),
discount(disc_rate)
{}

Bulk_item(const
std::string
&book,
double
sales_price,

std::size_t
min,
double
dis)
:

Item_base(book,sales_price),
min_qty(min),
discount(dis)
{}

double
net_price(std::size_t
n)
const;

 

private:

std::size_t
min_qty;

double
discount;

};

 

 

/* Item.cc */

#include "Item.h"

bool
Item_base::isPrecious(Item_base
&other)

{

if(price
>
other.price)

return
true;

return
false;

}

 

double
Bulk_item::net_price(std::size_t
n)
const

{

if(n>=min_qty)

return
price*(1-discount)*n;

return
price*n;

}

 

 

/* test.cc */

#include "Item.h"

using
std::cout;

using
std::endl;

int
main()

{

Item_base
base("TN-119",12.3);

Bulk_item
bulk("TNP-132",13.3,3,0.2);

cout
<<base.book()
<<" 3X total: "
<<base.net_price(3)
<<endl;

cout
<<bulk.book()
<<" 3X total: "
<<bulk.net_price(3)
<<endl;

 

return
0;

}

 

    和前面最大的不同在于,子类要重写基类的某个方法,如这里的double
Bulk_item::net_price(std::size_t
n)
const。那么这个方法就完全是子类自己定义的,它将不能访问从基类那继承过来的private成员,除非在基类中把这些成员定义为protected。

    和例子1中讲的一样,在类中访问有权限访问的成员时,必须依赖于该类的一个对象,如这里的this(隐式的);同样,若net_price(xx, Bulk_item bulk)还有一个bulk参数,那么它也可以访问bulk.price;但是,若net_price(xx, Item_base base)有一个base参数,那它不能访问base.price,因为一个类内不能访问其它类的非public成员。

C++中的public、private、protected成员继承问题的更多相关文章

  1. [转]java中作用域public private protected 以及不写的区别

    在说明这四个关键字之前,我想就class之间的关系做一个简单的定义,对于继承自己的class,base class可以认为他们都是自己的子女,而对于和自己一个目录下的classes,认为都是自己的朋友 ...

  2. Java中public,private,protected,和默认的区别

    Java中public,private,protected,和默认的区别 1.private修饰词,表示成员是私有的,只有自身可以访问: 2.protected,表示受保护权限,体现在继承,即子类可以 ...

  3. php class中public,private,protected的区别,以及实例

    一,public,private,protected的区别 public:权限是最大的,可以内部调用,实例调用等. protected: 受保护类型,用于本类和继承类调用. private: 私有类型 ...

  4. 访问权限系列一(public/private/protected/default):成员变量

    通过两个程序包对自身或互相之间的访问,得到结果.(先编译Test_01,得到class文件,通过Test的集中访问情况) 如下Test.java中内容: package com.java; /* * ...

  5. PHP中const,static,public,private,protected的区别

    原文地址:http://small.aiweimeng.top/index.php/archives/54.html const: 定义常量,一般定义后不可改变static: 静态,类名可以访问pub ...

  6. PHP中public,private,protected,abstract等关键字用法详解

    PHP中常用的关键字 在PHP中包含了很多对函数和类进行限制的关键字,常用的通常有abstract,final,interface,public,protected,private,static等等, ...

  7. public/private/protected访问控制权限的区别

    //public/private/protected访问控制权限的区别//时间:2016/8/16 //(一)修饰成员: //public: 在类内.类外都能使用 . //protected: 在类内 ...

  8. 深入浅出OOP(五): C#访问修饰符(Public/Private/Protected/Internal/Sealed/Constants)

    访问修饰符(或者叫访问控制符)是面向对象语言的特性之一,用于对类.类成员函数.类成员变量进行访问控制.同时,访问控制符也是语法保留关键字,用于封装组件. Public, Private, Protec ...

  9. public private protected和默认的区别(转自百度)

    public private protected和默认的区别 Java中对类以及类中的成员变量和成员方法通过访问控制符(access specifier)进行区分控制.刚学Java语言的同学可能对pu ...

  10. 【转】C++ 类访问控制public/private/protected探讨

    示例1:---------------------------------------- class C{ int c1; int c2;public: void set(C* s, int i, i ...

随机推荐

  1. Spark(二)CentOS7.5搭建Spark2.3.1分布式集群

    一 下载安装包 1 官方下载 官方下载地址:http://spark.apache.org/downloads.html 2  安装前提 Java8         安装成功 zookeeper  安 ...

  2. 【PAT】1015 德才论 (25)(25 分)

    1015 德才论 (25)(25 分) 宋代史学家司马光在<资治通鉴>中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不得 ...

  3. USACO 4.3 Letter Game (字典树)

    Letter GameIOI 1995 Figure 1: Each of the 26 lowercase letters and its value Letter games are popula ...

  4. Warning -27077: The "vuser_init" section contains web function(s) when the "Simulate a new user on each iteration" Run-Time Setting is ON.

    通过LR来录制登录过程并生成脚本,设置了自动关联,并回放录制脚本,观察回放日志发现没有报error信息,说明脚本没有问题,将脚本放入Controller中设置100个用户设置运行,发现运行一段时间开始 ...

  5. Inno Setup使用

    Inno Setup是一个开源的安装包打包软件,下载地址是:http://www.jrsoftware.org/isdl.php 使用引导界面创建一个安装包打包 配置参考官方文档:http://www ...

  6. Ionic Js十二:导航ion-nav-view

     ion-nav-view 当用户在你的app中浏览时,ionic能够检测到浏览历史.通过检测浏览历史,实现向左或向右滑动时可以正确转换视图. 采用AngularUI路由器模块等应用程序接口可以分为 ...

  7. ECSHOP中 {insert name='ads' id=$ads_id num=$ads_num}含义

    <div class="smallban">        <ul>                <!-- TemplateBeginEditabl ...

  8. Git错误提示之:fatal: Not a git repository (or any of the parent directories): .git

    产生原因:一般是没有初始化git本地版本管理仓库,所以无法执行git命令 解决方法:操作之前执行以下命令行: git init 然后执行一下git status查看状态信息,good,问题解决.

  9. html5+css3 h5页面生成的思路

    <!DOCTYPE html><html style="height: 100%;"> <head> <meta charset=&quo ...

  10. JPA实体类中的注解

    @Entity 标注于实体类上,通常和@Table是结合使用的,代表是该类是实体类@Table 标注于实体类上,表示该类映射到数据库中的表,没有指定名称的话就表示与数据库中表名为该类的简单类名的表名相 ...