#include <stdlib.h>
#include <iostream>
using namespace std;
class AbstractClass {
public:
AbstractClass()
{
}
virtual ~AbstractClass()
{
}
virtual void toString() = 0;
};
class SubClass : public AbstractClass
{
public:
SubClass() : AbstractClass()
{
}
public:
~SubClass()
{
}
public:
void toString()
{
cout << "Sub::toString()\n";
}
};
int main()
{
SubClass s;
AbstractClass &c = s;
c.toString();
return (0);
}
/***********************************************************/
/***********************************************************/
1--------------------------------------------------
用=0作为初始式使虚函数成为“纯虚函数”;
如果一个类里存在一个或者几个纯虚函数,这个类就是“抽象类”:
class Shape { // 抽象类
public:
virtual void rotate(int) = 0;
virtual void draw() = 0;
virtual bool is_closed() = 0;
// ...
};
2--------------------------------------------------
不能创建抽象类的对象:
Shape s; // 错误:抽象类Shape的变量
3--------------------------------------------------
抽象类只能做界面,作为其他类的基类:
class Point { /* ... */ };
class Circle : public Shape {
public:
void rotate(int) { } // 覆盖Shape::rotate
void draw(); // 覆盖Shape::draw
bool is_closed() { return true; } // 覆盖Shape::is_closed
Circle(Point p, int r);
private:
Print center;
int radius;
};
4--------------------------------------------------
一个未在派生类里定义的纯虚函数仍旧还是一个纯虚函数,这种情况使该派生类仍为一个抽象类:
class Polygon : public Shape { // 抽象类
public:
bool is_closed() { return true;} // 覆盖Shape::is_closed
// ......draw和rotate尚未覆盖......
};
Polygon b; // 错误:声明的是抽象类Polygon对象
class Irregular_polygon : public Polygon {
list lp;
public:
void draw(); // 覆盖Shape::draw
void rotate(int); // 覆盖Shape::rotate
// ...
};
Irregular_polygon poly(some_points); // 可以(假定有合适的构造函数)
5--------------------------------------------------
抽象类的最重要用途就是提供一个界面,而又不暴露任何实现细节:
class Charater_devece {
public:
virtual int open(int opt) = 0;
virtual int close(int opt) = 0;
virtual int read(char* p), int n) = 0;
virtual int write(const char* p, int n) = 0;
virtual int ioctl(int ...) = 0;
virtual ~Charater_device() { } // 虚析构函数
};
我们随后可以将驱动程序描述为由Charater_device派生的类,并经由这个界面去操作各种各样的驱动程序
文章评论(0条评论)
登录后参与讨论