闲云潭影日悠悠,物换星移几度秋

你既然已经做出了选择, 又何必去问为什么选择。鬼谷绝学的要义, 从来都不是回答, 而是抉与择

普通类

#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++中的基类和派生类?的更多相关文章

  1. C++primer原书中的一个错误(派生类using声明对基类权限的影响)

    在C++primer 第4版的 15章 15.2.5中有以下这样一段提示: "注解:派生类能够恢复继承成员的訪问级别,但不能使訪问级别比基类中原来指定的更严格或者更宽松." 在vs ...

  2. c# 中基类变量指向派生类对象的实例化

    这一篇文章转载自:http://www.xuebuyuan.com/390279.html 我对这篇文章进行了一一的验证,确实是这样子的,也明白了很多东西,觉得很有用,转载过来希望能够帮助大家. 1. ...

  3. OOP2(虚函数/抽象基类/访问控制与继承)

    通常情况下,如果我们不适用某个函数,则无需为该函数提供定义.但我们必须为每个虚函数都提供定义而不管它是否被用到了,这因为连编译器也无法确定到底会适用哪个虚函数 对虚函数的调用可能在运行时才被解析: 当 ...

  4. C++学习之路—继承与派生(二):派生类的构造函数与析构函数

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 由于基类的构造函数和析构函数是不能被继承的,所以 ...

  5. C++类继承中,基类/当前对象属性/当前对象的构造顺序

    [1]中提到,规范的派生类构造函数三个要点: 首先创建基类对象 应通过成员初始化列表,创建基类对象 应该初始化本派生类新增的成员变量 那在构造派生类实例的过程中,其基类(以及多继承的时候多个基类)/当 ...

  6. C++继承 派生类中的内存布局(单继承、多继承、虚拟继承)

    今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的.看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用. ——谈VC++对象模型(美)简.格雷程化    译 译者前言 一个C ...

  7. C++继承具体解释之二——派生类成员函数具体解释(函数隐藏、构造函数与兼容覆盖规则)

    在这一篇文章開始之前.我先解决一个问题. 在上一篇C++继承详解之中的一个--初探继承中,我提到了在派生类中能够定义一个与基类成员函数同名的函数,这样派生类中的函数就会覆盖掉基类的成员函数. 在谭浩强 ...

  8. cc31a_demo--CppPrimer_静态成员与继承-在派生类中访问基类中的static成员的方法

    //*基类中的static成员,在整个继承层次中只有一个实例 //*在派生类中访问基类中的static成员的方法 //1.基类名::成员名 //2.子类名::成员名 //3.对象.成员名 //4.指针 ...

  9. C++ | 继承(基类,父类,超类),(派生类,子类)

    转载:https://blog.csdn.net/Sherlock_Homles/article/details/82927515 文章参考:https://blog.csdn.net/war1111 ...

随机推荐

  1. 【Unity】6.1 Unity中的C#脚本基础知识

    分类:Unity.C#.VS2015 创建日期:2016-04-16 一.简介 1.常用的C#数据类型 这里简单介绍用Unity开发游戏时,最常用的一些数据类型. (1)基本类型 int.float. ...

  2. rdesktop 源码安装

    # ./configure --prefix=/data/apps/rdesktop-1.6.0 #make && make install

  3. CCParallaxNode

    // 创建cat精灵 CCSprite* cat = CCSprite::create("Image\\grossini.png"); //change the transform ...

  4. VLAN,GRE,VXLAN

    https://www.cnblogs.com/charles1ee/p/6629009.html VLAN介绍 局域网LAN(多个机器连接一个Hub或者Switch),是一个广播域 VLAN:一台S ...

  5. .NET+MVC+Alipay的Sdk版单笔转账到支付宝账户接口

    public class AliPayController : Controller { // GET: AliPay public ActionResult Index() { return Red ...

  6. echarts的时间线图表

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script sr ...

  7. 在Mac上安装与使用mitmproxy

    [本文出自天外归云的博客园] 介绍 Mitmproxy是一款支持HTTP(S)的中间人代理工具.不同于Fiddler2,burpsuite等类似功能工具,mitmproxy可在终端下运行,并且支持编写 ...

  8. 使用一层神经网络训练mnist数据集

    import numpy as np import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_dat ...

  9. WPF学习笔记(1)——image控件图片不显示的问题

    说明(2017-6-7 16:08:35): 1. 本来想用winform的,用winform就没这么多破事了. 2. 不过项目要用WPF,拉出一个mediaelement控件,视频正常显示. 3. ...

  10. 浅谈C#中的深拷贝(DeepCopy)与浅拷贝(MemberwiseClone)

    场景:MVVM模式中数据双向绑定,想实现编辑.保存.撤销操作时也双向绑定了,不能实现撤销操作. 后来通过搜索找到了继承IEditableObject接口实现撤销操作,但是对其中使用了Memberwis ...