1.不同于Java中通过extends实现继承,C++是通过:实现的。

2.C++中同样包含public,private,protected三个关键字:

public关键字表示在任意其他类中可调用该成员。

private关键字表示该成员只能在声明该成员的类中使用。

protected关键字用于继承,可在本类中调用声明为protected的成员,也可以在子类中通过子类对象调用,而不能通过父类对象调用。

3.virtual关键字表示该函数可以被子类继承并重写。

如果父类的成员函数声明为virtual,则子类可以重新定义该成员函数,重新定义时去掉virtual关键字。

如果父类的成员函数是普通的函数,则子类继承之后不能重新定义该函数。

4.代码片段如下:

 #include <iostream>
#include <string> using namespace std; class Item_base
{
public:
Item_base(const string &is,double p):isbn(is),price(p){}
string book()
{
return isbn;
}
virtual double calMoney(int c)
{
return c * price;
}
private:
string isbn;
protected:
double price;
}; class Bulk_item : public Item_base
{
public:
Bulk_item::Bulk_item(const string &is,double p,int c,double dis):
Item_base(is,p),min_py(c),discocunt(dis){}
double calMoney(int c)
{
cout<<endl<<"子类"<<endl;
if(c > min_py)
{
return c * price * discocunt;
}
else
{
return c * price;
}
}
void test()
{
cout<<endl<<"子类测试!!"<<endl;
}
private:
int min_py;
double discocunt;
}; int main()
{
string itemIsbn = "x-123-1234-x";
Item_base item(itemIsbn,10.0);
cout<<item.calMoney()<<endl; Bulk_item item2("123-456-x",10.0,,0.8);
cout<<item2.calMoney()<<endl;
item2.test(); Item_base *item3 = new Bulk_item("123-456-789-x",10.0,,0.8);
cout<<item3->calMoney()<<endl;
//不能调用子类的test方法
return ;
}

5.C++中的继承不同于Java,C++支持公有继承、私有继承和受保护的继承。

公有继承又称为接口继承,私有继承和受保护继承又称为实现继承。最常用的继承方式是公有继承。

私有继承是指将父类中的public,protected的成员变为private。

受保护继承是指将父类中public的成员变成protected的。

public 继承:

 class A
{
public :
A()
{
a = ;
b = ;
c = ;
}
int a;
protected:
int b;
private:
int c;
}; class B1 : public A
{
public :
void test()
{
cout<<"公有继承 "<<a<<" , "<<b<<endl;
//cout<<c<<endl;
}
};

private继承:

 class B2 : private A
{
//私有继承将A中public protected的成员变为private
public :
void test()
{
cout<<"私有继承 "<<a<<" , "<<b<<endl;
//cout<<c<<endl;
}
};
protected继承:
 class B3 : protected A
{
//受保护继承将A中public的成员变为protected
public:
void test()
{
cout<<"受保护继承 "<<a<<" , "<<b<<endl;
}
};

6.可以通过修改继承访问方式实现去除个别成员(关键字是using)。

例如父类A中public 的成员,通过私有继承时,父类的public成员变为私有的,可以通过using A::a;语句实现公有。

 class B2 : private A
{
//私有继承将A中public protected的成员变为private
public :
using A::a2;//将a2变为public 的
void test()
{
cout<<"私有继承 "<<a<<" , "<<b<<endl;
//cout<<c<<endl;
}
};

7.默认继承访问级别:

(1)class默认的继承是私有的,其内的成员默认的也是私有的。

(2)struct默认的继承是公有的,其内的成员默认的也是公有的。

(3)C++中除了默认的继承访问级别不同,class和struct是相同的。

 class D : A//默认的继承是private
{
int a;//默认的成员变量是private
}; struct E : A//默认的继承是public
{
int a;//默认的是public
};

8.整体代码如下:

 class A
{
public :
A()
{
a = ;
b = ;
c = ;
a2 = ;
}
int a;
int a2;
protected:
int b;
private:
int c;
}; class D : A//默认的继承是private
{
int a;//默认的成员变量是private
}; struct E : A//默认的继承是public
{
int a;//默认的是public
}; class B1 : public A
{
public :
void test()
{
cout<<"公有继承 "<<a<<" , "<<b<<endl;
//cout<<c<<endl;
}
}; class B2 : private A
{
//私有继承将A中public protected的成员变为private
public :
using A::a2;//将a2变为public 的
void test()
{
cout<<"私有继承 "<<a<<" , "<<b<<endl;
//cout<<c<<endl;
}
}; class B3 : protected A
{
//受保护继承将A中public的成员变为protected
public:
void test()
{
cout<<"受保护继承 "<<a<<" , "<<b<<endl;
}
}; int main()
{
B1 b1;
cout<<b1.a<<endl;
// cout<<b1.b<<endl;//不可访问
// cout<<b1.c<<endl;//不可访问
b1.test(); B2 b2;
cout<<b2.a2<<endl;
// cout<<b2.a<<endl;//不可访问
// cout<<b2.b<<endl;//不可访问
// cout<<b1.c<<endl;//不可访问
b2.test(); B3 b3;
//cout<<b3.a<<endl;//不可访问
//cout<<b3.b<<endl;//不可访问
//cout<<b3.c<<endl;//不可访问
b3.test();
return ;
}
后续更新中....

C++学习基础九——继承的更多相关文章

  1. [ Java学习基础 ] Java的继承与多态

    看到自己写的东西(4.22的随笔[ Java学习基础 ] Java构造函数)第一次达到阅读100+的成就还是挺欣慰的,感谢大家的支持!希望以后能继续和大家共同学习,共同努力,一起进步!共勉! ---- ...

  2. 深度学习基础系列(九)| Dropout VS Batch Normalization? 是时候放弃Dropout了

    Dropout是过去几年非常流行的正则化技术,可有效防止过拟合的发生.但从深度学习的发展趋势看,Batch Normalizaton(简称BN)正在逐步取代Dropout技术,特别是在卷积层.本文将首 ...

  3. 多线程学习笔记九之ThreadLocal

    目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...

  4. {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证

    Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...

  5. day 63 Django基础九之中间件

    Django基础九之中间件   本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学 ...

  6. JavaScript学习基础部分

    JavaScript学习基础 一.简介 1.JavaScript 是因特网上最流行的脚本语言,并且可在所有主要的浏览器中运行,比方说 Internet Explorer. Mozilla.Firefo ...

  7. 【IOS学习基础】NSObject.h学习

    一.<NSObject>协议和代理模式 1.在NSObject.h头文件中,我们可以看到 // NSObject类是默认遵守<NSObject>协议的 @interface N ...

  8. 20165318 预备作业二 学习基础和C语言基础调查

    20165318 学习基础和C语言基础调查 技能学习经验 我们这一代人,或多或少的都上过各种兴趣班,舞蹈钢琴画画书法,我也是如此.可这些技能中,唯一能拿的出手的就是舞蹈了.按照<优秀的教学方法- ...

  9. [ Java学习基础 ] Java构造函数

    构造方法是类中特殊方法,用来初始化类的实例变量,它在创建对象(new运算符)之后自动调用. Java构造方法的特点如下: 构造方法名必须与类名相同. 构造方法没有任何返回值,包括void. 构造方法只 ...

随机推荐

  1. (spring-第17回【AOP基础篇】) 创建增强类

    一.   增强类包含的信息: a)   横切逻辑(插入的具体代码) b)   部分连接点信息(在方法的哪个位置插入代码,比如方法前.方法后等). 二.   增强的类型 每一种增强有一个需要实现的增强类 ...

  2. nl2br() 函数

    nl2br() 函数在字符串中的每个新行 (\n) 之前插入 HTML 换行符 (<br />).经常用于在线编辑的内容,以便显示. 用法:nl2br(string) 参数 描述 stri ...

  3. magento jQuery冲突N种方法

    在做修改模板的时候在page中加入jquery库发现原本自带的js冲突 商品无法加入购物车,很多js都没有效果 这是jQuery和magento自带prototype的冲突解决版本有很多种,说个简单点 ...

  4. 跨服务器之间的session共享

    跨服务器之间的Session共享方案需求变得迫切起来,最终催生了多种解决方案,下面列举4种较为可行的方案进行对比探讨: 1. 基于NFS的Session共享 NFS是Net FileSystem的简称 ...

  5. python数据结构与算法——队列

    队列结构可以使用数组来模拟,只需要设定头和尾的两个标记 参考自<啊哈> # 按书中的代码会出现索引越界的问题(书中申请了超量的空间) # 尝试令tai初始为len(q)-1则不会出错但少了 ...

  6. SE03 打包请求

    请求打包,是传输请求时候常用的一种方法.步骤如下:注意点:1.打包请求一定仔细检查,不要遗漏          如果请求不多,分开传是更好的方式,不容易遗漏,导致问题,        2.请求释放后才 ...

  7. 判断JS是否加载完成

    在正常的加载过程中,js的加载都是同步的,也就是在加载过程中,浏览器会阻塞接下来的内容的加载.这时候我们就要用到动态加载,动态加载是异步的,如果我们在后边要用到这个动态加载的js文件里的东西,就要保证 ...

  8. [转载]BT656/BT601/BT1120协议

     [转载] BT656/BT601/BT1120协议以及DM365/DM355/DM6467上使用的YUV颜色空间说明   ITU-R BT.601和ITU-RBT.656国际电信联盟(Interna ...

  9. 递归输出文件夹下的所有文件的名称(转自 MSDN)

    问题:如何输出给定文件夹目录下面的所有文件的名称? C#代码: using System; using System.IO; namespace MyTest { public class Progr ...

  10. 如何正确做 Web端压力测试?

    ​    ​一个完整的压力测试需要关注三个方面:如何正确产生压力.如何定位瓶颈.如何预估系统的承载能力. ​    ​(1) 如何产生压力:产生压力的方法有很多,通常可以写脚本产生压力机器人对服务器进 ...