初识C++继承
先是自己凭借自己在课堂上的记忆打了一遍。自然出了错误。
//编译错误
#include <iostream>
#include <cstdlib>
using namespace std;
class people
{
private:
int age;
int sex; // 1 -girl 2 -boy
public:
people(int a = 0, int b = 0): age(a), sex(b){};
};
class student : public people
{
private:
int num;
int score;
string name;
public:
student(int bnum = 0, int bscore = 0, int bage = 0, int bsex = 0, string bname):people(bage, bsex) //错误
{
num = bnum;
score = bscore;
name = bname;
};
void display();
};
void student::display()
{
if(sex == 1) //错误
cout << name << " girl " << num << " " << age << " " << score << endl;
else
cout << name << " boy " << num << " " << age << " " << score << endl;
}
int main()
{
student Liming(10001, 100, 20, 2, "李鸣");
Liming.display() ;
return 0;
}
错误小结:
1.类student是public继承于类people,那么在student的成员函数中,无法访问父类的private和protected属性的成员,只能通过继承过来的父类的成员函数访问它们。
2.初始化列表写错了。函数的默认参数最后一句 string bname; 应该是 string bname = "";
改了之后,可以运行了。
#include <iostream>
#include <cstdlib>
using namespace std;
class people
{
private:
int age;
int sex; // 1 -girl 2 -boy
public:
people(int a = 0, int b = 0): age(a), sex(b){};
int getage();
int getsex();
};
int people::getage()
{
return age;
}
int people::getsex()
{
return sex;
}
class student : public people
{
private:
int num;
int score;
string name;
public:
student(string bname,int bnum = 0, int bscore = 0, int bage = 0, int bsex = 0)
:people(bage, bsex),num(bnum),score(bscore){name = bname;};
void display();
};
void student::display()
{
if(getsex() == 1)
cout << name << " girl " << num << " " << getage() << " " << score << endl;
else
cout << name << " boy " << num << " " << getage() << " " << score << endl;
}
int main()
{
student Liming("李鸣", 10001, 100, 20, 2);
Liming.display() ;
return 0;
}

学习到的知识点:
1.对于父类的派生类来说,其对象的初始化需要利用初始化列表进行操作。比如:
student(string bname, int bnum = 0, int bscore = 0, int bage = 0, int bsex = 0)
:people(bage, bsex),num(bnum),score(bscore){name = bname;};
上面的语句调用了父类的初始化构造函数,所以父类的构造函数应具有含参构造函数,可以利用重载来实现。
个人的习惯是:写一个含有默认参数的初始化列表。
2.如果是public继承,那么在派生类的成员函数中无法访问其从父类继承过来的具有private和protected属性的成员。
这个时候,可以通过调用从父类继承过来的成员函数获取其值。例如:
int people::getage()
{
return age;
}
int people::getsex()
{
return sex;
}
···
void student::display()
{
if(getsex() == 1) //调用父类的成员函数
cout << name << " girl " << num << " " << getage() << " " << score << endl;
else
cout << name << " boy " << num << " " << getage() << " " << score << endl;
}
3.复习了一下含有默认参数的构造函数,设置默认参数时应从右向左。例如:
student(int bnum = 0, int bscore = 0, int bage = 0, int bsex = 0, string bname):people(bage, bsex) //错误
应为:
student(int bnum = 0, int bscore = 0, int bage = 0, int bsex = 0, string bname = ""):people(bage, bsex)
初识C++继承的更多相关文章
- C++_基础_运算符重载2
内容: (1)只能用成员形式重载的运算符 (2)new/delete操作符的重载 (3)封装和继承的初识 (4)继承的特性 (5)子类及其函数的特性 (6)多重继承和虚继承 1.只能用成员形式重载的运 ...
- OC 初识NSString,self关键字,继承,成员变量的可见性,description方法
OC 初识NSString,self关键字,继承,成员变量的可见性,description方法 初识 NSString: char * string = "旭宝爱吃鱼"; 常量字符 ...
- python基础(17)继承类和面向对象初识
1.继承类 class Lm: money = 1000000 house = 5 def driver(self): print('会开车') class Mcb(Lm): def about_me ...
- python 全栈开发,Day19(组合,组合实例,初识面向对象小结,初识继承)
一.组合 表示的一种什么有什么的关系 先来说一下,__init__的作用 class Dog: def __init__(self, name, kind, hp, ad): self.name = ...
- Day7 初识面向对象,面向对象之继承、多态和封装
一.面向对象引言 一.面向对象的程序设计的由来 详述见:http://www.cnblogs.com/linhaifeng/articles/6428835.html 二.面向对象引子 写一个简单程序 ...
- day24 01 初识继承
day24 01 初识继承 面向对象的三大特性:继承,多态,封装 一.继承的概念 继承:是一种创建新类的方式,新建的类可以继承一个或者多个父类,父类又可称基类或超类,新建的类称为派生类或者子类 cla ...
- 初识JAVA(【面向对象】:pub/fri/pro/pri、封装/继承/多态、接口/抽象类、静态方法和抽象方法;泛型、垃圾回收机制、反射和RTTI)
JAVA特点: 语法简单,学习容易 功能强大,适合各种应用开发:J2SE/J2ME/J2EE 面向对象,易扩展,易维护 容错机制好,在内存不够时仍能不崩溃.不死机 强大的网络应用功能 跨平台:JVM, ...
- 红豆带你从零学C#系列之:初识继承与多态
继承 现实生活当中,人类又可以根据职业分为:教师,学生,理发师,售货员 又比如飞机又有种类之分:直升飞机.客机.货机.战斗机等 在程序里面我们可能会通过创建类来描述这样的事物,比如学生类.教师类.理发 ...
- 初识Hibernate之继承映射
前面的两篇文章中,我们介绍了两张表之间的各种相互关联映射关系,但往往我们也会遇到两张表甚至多张表之间共有着多个相同的字段.例如: 如图,student表和teacher表共同具有id,nam ...
随机推荐
- mysql python pymysql模块 基本使用
我们都是通过MySQL自带的命令行客户端工具mysql来操作数据库,那如何在python程序中操作数据库呢? 这就用到了pymysql模块,该模块本质就是一个套接字客户端软件,使用前需要事先安装 pi ...
- Chrome插件汇总
Chrome浏览器可以增加很多插件,帮助我们更方便地使用. 1 重新定位新标签页 名字:Infinity.crx 官网:http://www.infinitynewtab.com/ 效果图如下: ...
- logstash采集tomcat日志、mysql错误日志
input{ file { path => "/opt/Tomcat7.0.28/logs/*.txt" start_position => "beginni ...
- C# 序列化(Serialize)与反序列化(Deserialize)
序列化是将对象的状态信息转换为可保持或传输的格式的过程(一堆字符),比如转化为二进制.xml.json等的过程. 反序列化就是将在序列化过程中所生成的二进制串.xml.json等转换成数据结构或者对象 ...
- ML实践详细经典教程----用例图、顺序图、状态图、类图、包图、协作图
面向对象的问题的处理的关键是建模问题.建模可以把在复杂世界的许多重要的细节给抽象出.许多建模工具封装了UML(也就是Unified Modeling Language?),这篇课程的目的是展示出UML ...
- Toaster
https://wiki.opendaylight.org/view/YANG_Tools:YANG_to_Java_Mapping#Identity https://wiki.opendayligh ...
- 【Win7 x64】+【annaconda3】+ 【python3.5.2】+【tensorflow-gpu】 [最终配置 gtx 940mx + Cuda8.0+cudnn v5.1 + tensorflow-gpu1.0.0 ]
1.安装cuda Toolkit 和cudnn (百度云可下载,版本需要对应) 2.配置环境变量: 3.安装cudnn(需要拷贝一些dll和lib来进行配置) 4.进入cmd,找到anaconda3的 ...
- transition和animation区别
Transform:对元素进行变形: Transition:对元素某个属性或多个属性的变化,进行控制(时间等),类似flash的补间动画.但只有两个关键贞.开始,结束. Animation:对元素某个 ...
- HashMap、HashTable、ConcurrentHashMap的区别
一.相关概念 1.Map的概念 javadoc中对Map的解释如下: An objectthat maps keys to values . Amap cannot contain duplicate ...
- js valueOf()函数用于返回指定对象的原始值
valueOf()函数用于返回指定对象的原始值. 该方法属于Object对象,由于所有的对象都"继承"了Object的对象实例,因此几乎所有的实例对象都可以使用该方法. 对象 返回 ...