C++: 类的继承派生

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、类中静态变量和常变量





猜你喜欢

转载自blog.csdn.net/liu1152239/article/details/71479536