1、首先来宏观的看看基类和派生类的关系
class base {//定义基类
public:
//构造函数
base() = default;
//const成员函数,不可以修改数据成员,也不能调用非const函数
//定义为virtual 的成员函数,基类希望派生类进行覆盖,当使用指针或引用调用该虚函数,
//改调用将被动态绑定。根据引用或指针所绑定的对象类型的不同,调用动态执行基类的版本或者某个派生类的版本
virtual double countPrice(int n) const //可在派生类中进行override
{
return n * price ;
}
//基类都应定义虚析构函数,即使该函数不执行任何实际操作
virtual ~base() = default;
private:
//私有数据成员,派生类不得访问
string bookNo;
protected:
//允许被 派生类覆盖基类的函数 访问的数据成员
double price;
}
class derived : public base {//继承自base的派生类
public:
derived () = default;
//派生类可以override覆盖基类的virtual函数,如果不覆盖,则直接继承自基类中该虚函数的版本
double countPrice(int n) const override;
private:
//新增的数据成员
double discount;
}
2、下面看看基本的基类和派生类关于数据成员的访问
(一般较大的工程类的声明在.h头文件中声明,类的定义在.cpp文件中实现)
test.h文件
#ifndef TEST_H
#define TEST_H
class baseclass {
public:
baseclass(){};
~baseclass(){};
void copy(int n);
public:
int a;
};
class derivedclass : public baseclass{
public:
derivedclass(){};
~derivedclass(){};
void copy(int n);//重载基类成员函数copy
public:
int b;
};
#endif//TEST_H
test.cpp文件(对两个类进行定义实现)
#include "stdafx.h"
#include "test.h"
#include<iostream>
using namespace std;
void baseclass::copy(int n)
{
cout << "baseclass" << endl;
a = n; //修改基类数据成员a
}
void derivedclass::copy(int n)
{
cout << "derivedclass" << endl;
b = n; //修改派生类数据成员b
a = n+n; //对基类数据成员a的修改
}
在main中实例化对象:
#include "stdafx.h"
#include<iostream>
#include "test.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
baseclass base1;
base1.copy(5);//base1.a = 5
derivedclass d2;
d2.copy(10);//d2.b = 10; d2.a = 20或者d2.baseclass::a = 20
cout << base1.a << endl;
cout << d2.b << endl;
cout << d2.a<< endl;
cout << d2.baseclass::a << endl;//对基类成员的访问方式有两种
return 0;
}
3、基类,派生类关于成员函数的访问
基类中成员函数可以互相调用;
派生类中,可以访问基类的成员函数;(public)
若派生类中有和基类同名的成员函数或数据成员(重载),则派生类对象访问自身成员函数和数据成员(e.g. d2.copy());否则访问继承自基类的数据成员(e.g. d2.baseclass::a)和成员函数。
4、类中静态变量和常变量