C++ Primer Plus书之--C++ 怎么定义一个抽象类

本文介绍了C++中的抽象基类,强调包含纯虚函数的类只能作为基类使用。纯虚函数通过在函数原型中添加=0来定义,即使提供了实现,类也会被视为抽象。抽象类不能实例化,示例代码展示了如何定义和使用抽象基类。
摘要由CSDN通过智能技术生成

抽象基类(Abstruct base class)

包含纯虚函数的类只用作基类, 要成为抽象基类, 必须至少包含一个纯虚函数.

纯虚函数: 函数原型中的=0使虚函数称为纯虚函数. 例如下面例子中的Area()方法

class BaseEllipse
{
private:
	double x;
	double y;
	
public:
	BaseEllipse(double x0 = 0, double y0 = 0) : x(x0), y(y0) {}
	virtual ~BaseEllipse() {}
	void Move(int nx, int ny)
	{
		x = nx;
		y = ny;
	}
	// 纯虚函数
	virtual double Area() const = 0;
}

这里的方法Area()没有定义, 但C++甚至允许纯虚函数有定义. 例如: 也许所有的基类方法都与Move()一样, 可以在基类中进行定义, 但仍需将这个类声明为抽象的. 在这种情况下, 可以将原型声明为虚的:

void Move(int nx, ny) = 0;

这将使基类成为抽象的, 但仍可以在实现文件中提供方法的定义:

void BaseEllipse::Move(int nx, ny)
{
    x = nx; 
    y = ny;
}

总之, 在原型中使用=0指出类是一个抽象基类, 在类中可以不定义该函数.

抽象类不能用来创建对象

 

 

抽象类的示例:

第一个文件

// acctabc.h
#ifndef ACCTABC_H_
#define ACCTABC_H_
#include <iostream>
#include <string>

// 抽象基类
class AcctABC
{
private:
	std::string fullName;
	long acctNum;
	double balance;
// protected修饰的子类可见, 外部不可见
protected:
	struct Formatting
	{
		std::ios_base::fmtflags flag;
		std::streamsize pr;
	};
	const std::string & FullName() const 
	{
		return fullName;
	}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 请创建一个抽象类DataStructure,该类包括下面的成员变量和成员函数: 1) 一个成员变量len,表示里面的元素个数最大值 2) 构造函数DataStructure(int l),将len初始化为0 3) 虚析构函数~DataStructure() 4) 纯虚函数Output(),输出DataStructure中的数据 5) 纯虚函数Size(),返回DataStructure中的元素个数 2. 请创建DataStructure的一个派生类MyString,该类包括下面的成员变量和成员函数: 1) 一个成员变量char* data,表示里面的数据 2) 构造函数MyString(int max_size),将MyString初始化为空串,最大元素个数为max_size 3) 析构函数~MyString(),释放相应的数据 4) Input()函数,往MyString输入数据 5) 重载operator+=()函数,实现两个字符串的连接 6) 重定义Output()和Size()函数 3. 请创建DataStructure的一个派生类MyStack,该类包括下面的成员变量和成员函数: 1) 一个成员变量int* data,用于里面的数据 2) 一个成员变量int top,表示最上面的元素下标 3) 构造函数MyStack(int max_size),将MyStack初始化为空栈,最大元素个数为max_size 4) 析构函数~MyStack(),释放相应的数据 5) Push_back(int e)函数,往栈里面压入一个数据e 6) 重定义Output()和Size()函数 4. 请编写main函数,测试上面程序的正确性 1) 创建两个MyString的对象str1和str2,分别调用Input函数输入str1和str2,然后分别调用operator+=函数将str2连接到str1的末尾 2) 创建一个MyStack的对象stack,调用Push_back函数输入往stack中输入m(m < max_size)个数据 3) 创建一个长度为3的DataStructure*类型的数组,将其3个元素分别指向str1, str2, stack,然后编写for循环调用Size()和Output()函数输出每个元素的大小和内容。 5. 输入输出样例: 1) 输入样例 A promising techni que for checking reachability 4 12 23 34 45 2) 输出样例 47 A promising technique for checking reachability 29 que for checking reachability 4 12 23 34 45
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值