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 ...
随机推荐
- ios日期格式转换
转自:http://blog.csdn.net/l_ch_g/article/details/8217725 1.如何如何将一个字符串如“ 20110826134106”装化为任意的日期时间格式,下面 ...
- HTTP模块SuperAgent
superagent它是一个强大并且可读性很好的轻量级ajaxAPI,是一个关于HTTP方面的一个库,而且它可以将链式写法玩的出神入化. var superagent = require('super ...
- 猫猫学iOS之小知识之xcode6自己主动提示图片插件 KSImageNamed的安装
猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 一:首先看效果 KSImageNamed是让XCode能预览项目 ...
- Socket网络编程--FTP客户端(2)(Windows)
上一篇FTP客户端讲到如果制作一个简单的FTP客户端,功能实现了,但是后面我们发现了问题,就是FTP是使用明文进行操作的.对于普通情况来说就无所谓了.但有时候要安全的一点的话,就应该使用FTP的安全版 ...
- lua -- encode and decode
json.encode 将表格数据编码为 JSON 字符串. 格式: jsonString = json.encode(表格对象) 用法示例: ,b=,c2=},d={,},}) echo(str) ...
- mysql--Ubuntu下设置MySQL字符集为utf8
1.mysql配置文件地址/etc/mysql/my.cnf 2.在[mysqld]在下方添加以下代码[mysqld]init_connect='SET collation_connection = ...
- Python Redis pipeline操作和Redis乐观锁保持数据一致性
Redis是建立在TCP协议基础上的CS架构,客户端client对redis server采取请求响应的方式交互. redis 乐观锁:也可理解为版本号比较机制,主要是说在读取数据逇时候同时读取其版本 ...
- 【Linux技术】常用的Linux系统调用
下面一些函数已经过时,被新的更好的函数所代替了(gcc在链接这些函数时会发出警告),但因为兼容的原因还保留着,这些函数将在前面标上“*”号以示区别. 一.进程控制 fork 创建一个新进程 clone ...
- Eclipse - Mac Os Default JRE missing
转:http://stackoverflow.com/questions/1736993/eclipse-mac-os-default-jre-missing 1) Follow Joshua's a ...
- LeetCode: Search in Rotated Sorted Array II 解题报告
Search in Rotated Sorted Array II Follow up for "LeetCode: Search in Rotated Sorted Array 解题报告& ...