public private, protect. 以及继承。 草稿。
#include <iostream>
#include <thread>
#include <memory>
// | 父类的public成员 | 父类的protected成员 | 父类的private成员
//---------------|------------------|---------------------|-----------------
//public继承 | public | protected | 访问不到
//---------------|------------------|---------------------|-----------------
//protected继承 | protected | protected | 访问不到
//---------------|------------------|---------------------|-----------------
//private继承 | private | private | 访问不到
using namespace std;
class Book
{
public:
string signture;
//virtual void showInfo() 不虚化,继承类如使用,基类指针,会调用基类方法.出错.
//除非使用派生类指针.非虚函数.会优先使用指针所定义的类型的方法(假如同名)
//从设计上说.这个就是程序本身错误的设计.继承的意义,就是继承类行为像一个基类,同名函数,而又不虚化,那么继承类中的同名非虚化函数就不应该存在.
//如果非要存在.就说明继承类行为上就不像一个基类.他们就不是继承关系.
void showInfo()
{
cout<<"book name:"<<name<<". price:"<<price<<". cost:"<<cost<<". supplier:"<<supplier<<". signtrue:"<<signture<<endl;
}
Book(const string& _name,int _c,int _p,const string& _s):name(_name),cost(_c),price(_p),supplier(_s){}
void SetCost(int _cost,int passWord)
{
if(passWord==123)
{
//private:只有book类的函数才可以访问.这里访问主体是book::SetCost(int,int,Book* this).访问对象是this->cost.
//虽然把setcost方法变成了public.但是我们可以利用函数的参数,要求输入密码.体现了类的封装性.
cost=_cost;
}
}
//可修改的参数,使用指针,不建议写成Book&, 参考google c++ 代码规范.
void SetOtherCost(int _cost,int passWord, Book* myBook)
{
if(passWord==123)
{
//这里访问主体是Book::SetOtherCost(int,int, Book* myBook,Book* this).访问对象是*myBook和*this.
myBook->cost=_cost;
cost=_cost;
}
}
private:
string name;
int cost;
int price;
string supplier;
};
//根据设计规范,只推荐book 和englichbook 继承一个抽象类.
//这里就english就强烈依赖book了.连showinfo.都没办法自定义.
class EnglichBook:public Book
{
public:
void showInfo()
{
cout<<"Tax:"<<tax<<". ";
Book::showInfo();
}
EnglichBook(const string& _name,int _c,int _p,const string& _s,int _tax):Book(_name,_c,_p,_s),tax(_tax){}
private:
int tax;
};
//public:任何函数都可以访问任何此类对象的public成员.
//private:就是说外部函数不可访问任何此类对象的私有成员.而类的内部函数可以访问任何此类对象的私有成员.
int main()
{
Book cpp=Book("c++ primer",20,50,"bird public");
cpp.showInfo();
cpp.signture=string("linson's book");//public:任何函数都可以访问.这里访问主体是main().访问对象是cpp.signture
//cpp.cost=5;//error. private:只有book类的函数才可以访问.
cpp.showInfo();
//密码错误,修改无效
cpp.SetCost(15,33);
cpp.showInfo();
//密码ok
cpp.SetCost(15,123);
cpp.showInfo();
Book cSharp=Book("c# good",10,20,"bird public");
//可以通过一个对象来访问另外一个对象的private私有成员.为什么.我们进入函数,分析一下.
cSharp.SetOtherCost(10,123,&cpp);
cpp.showInfo();
cSharp.showInfo();
EnglichBook cppEN=EnglichBook("c++ primer[EN]",20,50,"bird public",5);
Book* pcppen=&cppEN;
cppEN.showInfo();
pcppen->showInfo();//同名函数,且又不对基类函数虚化,产生的危害.
}
//public:任何函数都可以访问任何此类对象的public成员.
//private:就是说外部函数不可访问任何此类对象的私有成员.而类的内部函数可以访问任何此类对象的私有成员.
//protect:就是说外部函数不可访问任何此类对象的私有成员.而继承类类的内部函数可以访问任何此继承类对象的私有成员.
//但继承类的内部函数不可以访问基类的protect成员.
1.fun()==>fun(b* a)
2.fun(T*)==>fun(b* a,b* b)
如1,可以访问a的私有。那么也可以访问b的私有。
3.fun()==>fun(d* a)
4.fun(b*)==>fun(b* a,d* b)
如1,访问a的私有。但fun是继承类的函数。就不能访问除
不管基类还是继承类。他们的函数都只能访问本类产生出的对象的私有和protect。
也就是继承类不能访问基类对象的私有或protect对象。
public private, protect. 以及继承。 草稿。的更多相关文章
- C++ public private protect 继承关系(链接)
基础链接 总结: public继承基类成员访问权限没有变化; protected继承基类public和protected权限变为protected,基类private不变. private继承基类p ...
- public private protect
public 公有 使用public意味着声明public之后的成员对每个人都是可用的 private 私有 除非必须公开底层实现细目,否则就应该将所有的域指定为private protect 继 ...
- Public Private Protect Inheritance and access specifiers
In the previous lessons on inheritance, we've been making all of our data members public in order to ...
- c++三种继承方式public,protect,private
C++中的三种继承public,protected,private 三种访问权限 public:可以被任意实体访问 protected:只允许子类及本类的成员函数访问 private:只允许本类的成员 ...
- public、protect、private在父类子类中使用
先贴出一张,直观的.估计大家都见过的关于public.protect.private的范围图 作用域 当前类 同一package 子孙类 其他package public T ...
- c/c++再学习:C++中public、protect、private的访问权限控制
C++中public.protect.private的访问权限控制 访问权限 一个类的public成员变量.成员函数,可以通过类的成员函数.类的实例变量进行访问 一个类的protected成员变量.成 ...
- c++ 之private /protect/ public
C++中public.protect.private的访问权限控制 访问权限 一个类的public成员变量.成员函数,可以通过类的成员函数.类的实例变量进行访问 一个类的protected成员变量.成 ...
- C++中public,protected,private派生类继承问题和访问权限问题
C++中public,protected,private派生类继承问题和访问权限问题 当一个子类从父类继承时,父类的所有成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定. 1. ...
- 【转】C++易混知识点5:实例讲解Public Protected Private作用域,继承的区别和用意
大学生涯,涉及到类的作用域,继承都是用的public 共有继承,当时也没想那么多,觉得共有继承多方便,多简单,反正没有太多的限制,不管是类的成员或者是基类的成员函数都可以访问.没有深究.其实这里面真是 ...
随机推荐
- Unity: Invalid serialized file version xxx Expected version: 5.3.4f1. Actual version: 5.3.5f1.
Unity发布安卓项目,如果直接使用Unity打包APK一切Ok,导出Google项目 使用Idea打包 一进去直接Crash. 报错: 1978-2010/? E/Unity﹕ Invalid se ...
- php json 格式化
header('content-type:application/json;charset=utf8'); $arr = array( 'status' => true, 'errMsg' =& ...
- 总结Android中遇见的OOM
一 .Android应用中内存泄漏几种的原因: 1.单例模式导致的内存泄漏: 当调用getInstance时,如果传入的context是Activity的context.只要这个单例没有被释放,这个A ...
- NSAttributedString字符串属性类
//定义一个可变字符串属性对象aStr NSMutableAttributedString *aStr = [[NSMutableAttributedString alloc]initWithStri ...
- 网络适配器输入的IP地址 已经分配给另一个适配器
解决步骤:1.开始-运行-cmd2. set devmgr_show_nonpresent_devices=123.set devmgr_show_nonpresent_devices=14.star ...
- ACM-JAVA基础
ACM中的JAVA(基础) 众所周知,Java拥有良好的可移植性.无论在软件还是硬件领域,它都得到了广泛的使用,但是任何语言都有其缺陷,Java也不例外,Java运行在Java虚拟机上,因而相比C/C ...
- JavaScript中的apply和call函数详解(转)
每个JavaScript函数都会有很多附属的(attached)方法,包括toString().call()以及apply().听起来,你是否会感到奇怪,一个函数可能会有属于它自己的方法,但是记住,J ...
- java String 详解
1.java语言的字符串序列是通过字符串类实现的.java提供了3个字符串类:String类.StringBuilder类和StringBuffer类.String类是不变字符串,StringBuff ...
- ajax 如何接受 PHP页面返回的json数组
JSON JSON(JavaScript Object Notation)是Douglas Crockford提出的.他是一个轻量级的数据交换格式,基于JavaScript对象字面量. 我们可以将之前 ...
- 查询和删除表中重复数据sql语句
1.查询表中重复数据.select * from peoplewhere peopleId in (select peopleId from people group by ...