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

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

普通类

#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. ubuntu java 环境配置

    下载oracle java sudo add-apt-repository ppa:webupd8team/java -y sudo apt-get update sudo apt-get insta ...

  2. 菜鸟学Java(十二)——搭建一个完整的Java开发环境

    作为一个Java程序员,配置一个java开发环境是必备的技能,今天给广大菜鸟初学者补上一课.环境的配置,大概就分三个1,JDK 2,Tomcat(或者其他的)3,eclipse(或者myeclipse ...

  3. 关于angular的$resource中的isArray属性问题

    在之前的文章中讲到了在使用$resource的时候,有一个isArray属性. 这个属性在两个地方有提到: 1. angular学习笔记(二十八)-$http(6)-使用ngResource模块构建R ...

  4. 重复代码检查工具simian的基本用法

    simian是一个检查重复代码的工具,支持通过命令行和UI方式来检查代码,可以检查多种语言(比如C\C++, java, c#等)的代码,常见的编程语言都支持,下面先来看看如何使用命令行来检查c++重 ...

  5. (原创)发布一个C++版本的ORM库SmartDB(一)

    先简单说说ORM的优点: 提高开发效率,减少重复劳动,只和业务实体打交道,由业务实体自动生成sql语句,不用手写sql语句. 简单易用, 可维护性好. 隔离数据源,使得我们更换数据源时不用修改代码. ...

  6. 每日英语:How Often Do Gamblers Really Win?

    The casino billboards lining America's roadways tantalize with the lure of riches. 'Easy Street. It' ...

  7. u3d中的坐标系

    任何子级游戏对象 (Child GameObject) 的检视器 (Inspector) 中的变换 (Transform) 值都会相对于父级 (Parent) 的变换 (Transform) 值而显示 ...

  8. mysql查询字段为null 返回0

    SELECT   IF(AVG(字段) IS NULL,0, 字段) as 重命名   From  xxx

  9. Office 2010 激活 - Failed to inject memory!

    是不是用了mini-KMS_Activator这个工具去激活?是的话,把mini-KMS_Activator点出来,使用第一个按钮Install / Uninstall KM Service把它的服务 ...

  10. java框架篇---struts之OGNL详解

    OGNL(Object Graph Navigation Language),是一种表达式语言.使用这种表达式语言,你可以通过某种表达式语法,存取Java对象树中的任意属性.调用Java对象树的方法. ...