c++ 的类 和 类继承, 什么是c++中的基类和派生类?

闲云潭影日悠悠,物换星移几度秋
你既然已经做出了选择, 又何必去问为什么选择。鬼谷绝学的要义, 从来都不是回答, 而是抉与择
普通类
#ifndef TABTENN0_H_
#define TABTENN0_H_ #include <string> using namespace std; class TableTennisPlayer
{
private:
string firstname;
string lastname;
bool hasTable;
public:
TableTennisPlayer (
const string & fn = "none",
const string & ln = "none",
bool ht = false
);
void Name() const;
bool HasTable() const {return hasTable;};
void ResetTable(bool v) {hasTable = v;};
}; #endif
tabtenn0.h
#include <iostream>
#include <string>
#include "tabtenn0.h" using namespace std; TableTennisPlayer::TableTennisPlayer(const string & fn, const string & ln, bool ht): firstname(fn), lastname(ln), hasTable(ht) {} void TableTennisPlayer::Name () const
{
std::cout << lastname << "," << firstname ;
}
tabtenn0.cpp
#include <iostream>
#include "tabtenn0.h" using namespace std; int main (int argc, char const *argv[])
{
TableTennisPlayer player1("Chuck", "Blizzard", true);
TableTennisPlayer player2("Tara", "Boomdea", false);
player1.Name();
if (player1.HasTable()){
std::cout << ":has a table." << '\n';
}else{
std::cout << ":hasn't a table." << '\n';
};
player2.Name();
if (player2.HasTable()){
std::cout << ":has a table" << '\n';
}else{
std::cout << ":hasn't a table." << '\n';
};
return ;
}
usett0.cpp
继承类
基类的private成员都不能被派生类访问。
声明为public的方法和属性可以被随意访问;
声明为protected的方法和属性只能被类本身和其子类访问;
而声明为private的方法和属性只能被当前类的对象访问。
#include <iostream>
#include <string> using namespace std; class Father
{
private:
string first_name;
string last_name;
public:
Father(string fn, string ln): first_name(fn), last_name(ln) {};
void Name() {std::cout << first_name << ","<< last_name << '\n';};
}; class Son: public Father // 这句很重要呀
{
private: public:
Son(string an, string bn):Father(an, bn){};
}; int main(int argc, char const *argv[])
{
// Father father("张三", "李四");
// father.Name(); Son son("张三", "李四");
son.Name(); return ;
}
继承类写法
下面这个是两种展示调用基类方法的方式很有意思, 设计到拷贝构造和深浅拷贝, 有兴趣可以百度下
#ifndef TABTENN1_H_
#define TABTENN1_H_
#include <string> using namespace std; class TableTennisPlayer
{
private:
string firstname;
string lastname;
bool hasTable;
public:
TableTennisPlayer(const string & fn = "none",
const string & ln = "none",
bool ht = false);
void Name() const;
bool HasTable() const {return hasTable;};
void ResetTable(bool v) {hasTable = v;};
}; class RatedPlayer: public TableTennisPlayer
{
private:
unsigned int rating;
public:
RatedPlayer (unsigned int r = ,
const string & fn = "none",
const string & ln = "none",
bool ht = false
);
RatedPlayer (unsigned int r, const TableTennisPlayer & tp);
unsigned int Rating() const {return rating;};
void ResetRating (unsigned int r) {rating = r;}; }; #endif
tabtenn1.h
#include <iostream>
#include "tabtenn1.h" TableTennisPlayer::TableTennisPlayer (
const string & fn,
const string & ln,
bool ht):firstname(fn), lastname(ln), hasTable(ht) {} void TableTennisPlayer::Name() const
{
std::cout << lastname << ", " << firstname ;
} RatedPlayer::RatedPlayer (
unsigned int r,
const string & fn,
const string & ln,
bool ht): TableTennisPlayer(fn, ln, ht){
rating = r;
} RatedPlayer::RatedPlayer(
unsigned int r,
const TableTennisPlayer & tp
):TableTennisPlayer(tp), rating(r) {} /*
问题是上面这个类方法函数:
RatedPlayer::RatedPlayer(
unsigned int r,
const TableTennisPlayer & tp
):TableTennisPlayer(tp), rating(r) {} 的TableTennisPlayer(tp) 是不是等于 TableTennisPlayer = tp的意思 但是usett1.cpp 里面传入以后player1的作用是什么? */
tabtenn1.cpp
#include <iostream>
#include <string>
#include "tabtenn1.h" using namespace std; int main(int argc, char const *argv[])
{ /*
TableTennisPlayer player1("Tara", "Boomdea", false);
RatedPlayer rplayer1(1140, "Mallory", "Duck", true);
rplayer1.Name(); if (rplayer1.HasTable())
{
std::cout << ": has a table." << '\n';
}else
{
std::cout << ": hasn't a table." << '\n';
} std::cout << "Name:";
rplayer1.Name(); std::cout << "; Rating : " << rplayer1.Rating() << '\n'; */
TableTennisPlayer player1("Tara", "Boomdea", false);
RatedPlayer rplayer2 (, player1); std::cout << "Name: ";
rplayer2.Name(); std::cout << "; Rating : " << rplayer2.Rating() << '\n'; return ;
}
usett1.cpp
分为三种:
{
公有继承,
保护继承,
私有继承
}
从一个类派生出另一个类时, 原始类成为基类, 继承类成为派生类。粗俗的讲:子继承父, 父就是基类, 子就是派生类
这说明继承, 首先需要一个基类。
对于公有派生, 派生类对象包含基类对象, 基类的公有成员将成为派生类的公有成员;
基类的私有部分也将成为派生类的一部分, 但只能通过基类的公有和保护方法访问。换句话说: "派生类不能访问基类的私有成员, 必须通过基类的方法进行"
简单写法
class RatedPlayer: public TableTennisPlayer
{
private: public: };
构造函数
RatedPlayer::RatedPlayer(
unsigned int r,
const string & fn,
const string & fn,
cosnt string & ln,
bool ht
): TableTennisPlayer(fn, ln, ht) // 初始化基类构造函数, 或者说成员初始化列表
{
rating = r;
}
// 如果赋值RatedPlayer rplayer(1140, "Mallory", "Duck", true),
// 同时将“Mallory”, "Duck" 和 true赋给fn、ln和ht作为实参传递给TableTennisPlayer构造函数
如果省略成员初始化列表, 将会怎么样?
RatedPlayer::RatedPlayer(
unsigned int r,
const string & fn,
const string & fn,
cosnt string & ln,
bool ht
)
{
rating = r;
}
如果不调用基类构造函数, 与下面代码等效, 程序将使用默认的基类构造函数
RatedPlayer::RatedPlayer(
unsigned int r,
const string & fn,
const string & fn,
cosnt string & ln,
bool ht
): TableTennisPlayer() // 程序将使用默认的基类构造函数, 上面代码与此等效
{
rating = r;
}
注意: 除非要使用默认构造函数, 否则应显式调用正确的基类构造函数。
RatedPlayer::RatedPlayer(
unsigned int r,
const string & fn,
const string & fn,
cosnt string & ln,
bool ht
): TableTennisPlayer(tp)
{
rating = r;
}
未完待续...
c++ 的类 和 类继承, 什么是c++中的基类和派生类?的更多相关文章
- C++primer原书中的一个错误(派生类using声明对基类权限的影响)
在C++primer 第4版的 15章 15.2.5中有以下这样一段提示: "注解:派生类能够恢复继承成员的訪问级别,但不能使訪问级别比基类中原来指定的更严格或者更宽松." 在vs ...
- c# 中基类变量指向派生类对象的实例化
这一篇文章转载自:http://www.xuebuyuan.com/390279.html 我对这篇文章进行了一一的验证,确实是这样子的,也明白了很多东西,觉得很有用,转载过来希望能够帮助大家. 1. ...
- OOP2(虚函数/抽象基类/访问控制与继承)
通常情况下,如果我们不适用某个函数,则无需为该函数提供定义.但我们必须为每个虚函数都提供定义而不管它是否被用到了,这因为连编译器也无法确定到底会适用哪个虚函数 对虚函数的调用可能在运行时才被解析: 当 ...
- C++学习之路—继承与派生(二):派生类的构造函数与析构函数
(根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 由于基类的构造函数和析构函数是不能被继承的,所以 ...
- C++类继承中,基类/当前对象属性/当前对象的构造顺序
[1]中提到,规范的派生类构造函数三个要点: 首先创建基类对象 应通过成员初始化列表,创建基类对象 应该初始化本派生类新增的成员变量 那在构造派生类实例的过程中,其基类(以及多继承的时候多个基类)/当 ...
- C++继承 派生类中的内存布局(单继承、多继承、虚拟继承)
今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的.看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用. ——谈VC++对象模型(美)简.格雷程化 译 译者前言 一个C ...
- C++继承具体解释之二——派生类成员函数具体解释(函数隐藏、构造函数与兼容覆盖规则)
在这一篇文章開始之前.我先解决一个问题. 在上一篇C++继承详解之中的一个--初探继承中,我提到了在派生类中能够定义一个与基类成员函数同名的函数,这样派生类中的函数就会覆盖掉基类的成员函数. 在谭浩强 ...
- cc31a_demo--CppPrimer_静态成员与继承-在派生类中访问基类中的static成员的方法
//*基类中的static成员,在整个继承层次中只有一个实例 //*在派生类中访问基类中的static成员的方法 //1.基类名::成员名 //2.子类名::成员名 //3.对象.成员名 //4.指针 ...
- C++ | 继承(基类,父类,超类),(派生类,子类)
转载:https://blog.csdn.net/Sherlock_Homles/article/details/82927515 文章参考:https://blog.csdn.net/war1111 ...
随机推荐
- 记一次docker问题定位(perf,iostat等性能分析)
背景 最近参与的项目是基于 OpenStack 提供容器管理能力,丰富公司 IaaS 平台的能力.日常主要工作就是在开源的 novadocker 项目(开源社区已停止开发)基础上进行增强,与公司的其他 ...
- POJ 1200 Crazy Search(字符串简单的hash)
题目:http://poj.org/problem?id=1200 最近看了一个关于hash的问题,不是很明白,于是乎就找了些关于这方面的题目,这道题是一道简单的hash 字符串题目,就先从他入手吧. ...
- debian8.5安装sublime text3
在官网www.sublimetext.com下载安装包 我这里用的是Ubuntu 64 bit版. 下载后使用su命令切换到root账户. 执行安装命令 dpkg -i sublime-text*.d ...
- 【MySQL】MySQL表设计的常用数据类型
整数类型,tinyint.smallint.mediumint.int.bigint 如果需要保存整数(不含小数),可以选择tinyint.smallint.mediumint.int.bigint, ...
- package.json中配置浏览器
"browserlist":[ ">=1%", "last 2 versions" ],
- Spark提交任务提示 com.mysql.jdbc.Driver Class not found
com.mysql.jdbc.Driver Not Found 提示很奇怪,在sbt文件中已经引用了,编译也没有问题: "mysql" % "mysql-connecto ...
- 事件驱动模型的简单Java实现
事件驱动模型的原理不再赘述,Swing是不错的实现.别人也有不错的博文来说明原理. 本文的目的是提供一种简单的,可供参考的简短代码,用来帮助理解该模型. Project Navigator Event ...
- Linux下golang开发环境搭建
对于golang开发来说,Windows下可以用vscode或者liteide都不错,但是Linux下的开发也就只有vim了,所以怎么搞笑的利用vim进行golang开发呢? 参考官方推荐的一个插件: ...
- 使用httpclient下载 页面、图片
代码 import java.io.IOException; import java.io.UnsupportedEncodingException; import org.apache.http.c ...
- [转]mysql update case when和where之间的注意事项
原文地址:http://www.cnblogs.com/rwxwsblog/p/4512061.html 在日常开发中由于业务逻辑较为复杂,常常需要用到UPDATE和CASE...WHEN...THE ...