先是自己凭借自己在课堂上的记忆打了一遍。自然出了错误。

//编译错误
#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++继承的更多相关文章

  1. C++_基础_运算符重载2

    内容: (1)只能用成员形式重载的运算符 (2)new/delete操作符的重载 (3)封装和继承的初识 (4)继承的特性 (5)子类及其函数的特性 (6)多重继承和虚继承 1.只能用成员形式重载的运 ...

  2. OC 初识NSString,self关键字,继承,成员变量的可见性,description方法

    OC 初识NSString,self关键字,继承,成员变量的可见性,description方法 初识 NSString: char * string = "旭宝爱吃鱼"; 常量字符 ...

  3. python基础(17)继承类和面向对象初识

    1.继承类 class Lm: money = 1000000 house = 5 def driver(self): print('会开车') class Mcb(Lm): def about_me ...

  4. python 全栈开发,Day19(组合,组合实例,初识面向对象小结,初识继承)

    一.组合 表示的一种什么有什么的关系 先来说一下,__init__的作用 class Dog: def __init__(self, name, kind, hp, ad): self.name = ...

  5. Day7 初识面向对象,面向对象之继承、多态和封装

    一.面向对象引言 一.面向对象的程序设计的由来 详述见:http://www.cnblogs.com/linhaifeng/articles/6428835.html 二.面向对象引子 写一个简单程序 ...

  6. day24 01 初识继承

    day24 01 初识继承 面向对象的三大特性:继承,多态,封装 一.继承的概念 继承:是一种创建新类的方式,新建的类可以继承一个或者多个父类,父类又可称基类或超类,新建的类称为派生类或者子类 cla ...

  7. 初识JAVA(【面向对象】:pub/fri/pro/pri、封装/继承/多态、接口/抽象类、静态方法和抽象方法;泛型、垃圾回收机制、反射和RTTI)

    JAVA特点: 语法简单,学习容易 功能强大,适合各种应用开发:J2SE/J2ME/J2EE 面向对象,易扩展,易维护 容错机制好,在内存不够时仍能不崩溃.不死机 强大的网络应用功能 跨平台:JVM, ...

  8. 红豆带你从零学C#系列之:初识继承与多态

    继承 现实生活当中,人类又可以根据职业分为:教师,学生,理发师,售货员 又比如飞机又有种类之分:直升飞机.客机.货机.战斗机等 在程序里面我们可能会通过创建类来描述这样的事物,比如学生类.教师类.理发 ...

  9. 初识Hibernate之继承映射

         前面的两篇文章中,我们介绍了两张表之间的各种相互关联映射关系,但往往我们也会遇到两张表甚至多张表之间共有着多个相同的字段.例如: 如图,student表和teacher表共同具有id,nam ...

随机推荐

  1. Shell中的表达式及IF

    #!/bin/bash #你值得收藏的四则表达式运算. val1=1 val2=1 val3=1 val4=1 val5=1 val6=1 val7=1 let val1++ ((val2++)) v ...

  2. LINUX的前后台程序查看切换

    1.在Linux终端运行命令的时候,在命令末尾加上 & 符号,就可以让程序在后台运行 root@Ubuntu$ ./tcpserv01 & 2.如果程序正在前台运行,可以使用 Ctrl ...

  3. Spark Core(四)用LogQuery的例子来说明Executor是如何运算RDD的算子(转载)

    1. 究竟是怎么运行的? 很多的博客里大量的讲了什么是RDD, Dependency, Shuffle.......但是究竟那些Executor是怎么运行你提交的代码段的? 下面是一个日志分析的例子, ...

  4. shell脚本变量$#,$*,$$,$@,$0,$1,$2,$?的含义

    本文转录:https://blog.csdn.net/kejiaming/article/details/51859503 参数说明: $# 是传给脚本的参数个数 $ 是脚本本身的名字 $ 是传递给该 ...

  5. opencv3寻找最小包围矩形在图像中的应用-滚动条

    #include<opencv2/opencv.hpp> #include<iostream> #include<vector> using namespace c ...

  6. 机器学习理论基础学习3.4--- Linear classification 线性分类之Gaussian Discriminant Analysis高斯判别模型

    一.什么是高斯判别模型? 二.怎么求解参数?

  7. Android弹性滑动的三种实现方式

    引言 上一篇文章我们介绍了实现弹性滑动的三种方式,但仅仅是给出了代码片段和方法理论.今天我们结合一个具体的例子来谈一下如何使用这三种方法来实现弹性滑动.今天我们的例子是仿IOS的下拉操作,我们知道An ...

  8. js数组之从数组中删除元素

    使用pop()这个函数可以从数组中删除末尾的元素,shift方法可以删除数组中第一个元素.这些都是js中自带的函数,如果不使用这些函数的话,自己写的代码效率会很低的. <html> < ...

  9. linux mysql安装问题

    1.rpm -qa | grep mysql   //首先检查是否安装了mysql   2.如果安装了,卸载 rpm -e mysql   3\ 下载地址 http://dev.mysql.com/d ...

  10. Python的问题解决: IOError: [Errno 32] Broken pipe

    被该问题困扰的人还是挺多的,所以又对这个问题进行了一些更深入的分析,希望可以解决读者的问题新版本:Python 的 Broken Pipe 错误问题分析 遇到一个很奇怪的问题, web.py代码里面报 ...