C++的抽象基类

抽象基类的定义:

当我们把类看作一种数据类型时,通常会认为该类肯定是要被实例为一个或多个对象的。但在很多情况下,定义那些不能实例化出对象的类是很有用的,例如一个抽象基类Shape的纯虚函数Draw()它并不知道自己要画一个什么形状,具体画什么圆啊,矩形啊等等都由派生类决定。因此依据这个可以将类分为抽象类(不能实例对象)和具体类OR实现类(可以实例对象)。抽象类的唯一目的就是让其派生类继承并实现它的接口方法(例如上面谈到的Draw()),因此也通常被称为抽象基类。

抽象基类的创建

如果将基类的虚函数声明为纯虚函数(声明时"初始化"为0的函数),那么该类就被定义为抽象基类。

 class Shape   //抽象基类
 {
 public:
 		virtual void Draw(void) = 0;   //Dra()为纯虚函数
 };

函数名就是函数地址,讲一个函数初始化为0意味着函数的地址将为0,这就是在告诉编译器不要对该函数进行编址,从而阻止该类的对象实例化。一般的信息隐藏就是将类的数据成员声明为Private或Protected,但可以提供相应的Set()、Get()函数进行访问。而抽象类更进一步,它把数据和函数的实现都隐藏在实现类(派生类)中,而在抽象基类中提供丰富的接口函数供调用,这些函数都是Public的纯虚函数。这样的抽象基类又被称为接口类(Interface)。
[Tips]:
(0)c++中只有虚函数才可以被初始化为0

(1)抽象类不能实例化对象(例如,动物类可以派生出猫类,狗类。。。但不能创建一个动物对象吧!也没有具体的方法都是虚的);
(1):一个抽象类的派生类只有实现了基类的所有纯虚函数才能是具体类(即可以实例化对象),否则依然为抽象类;
(2):可以创建抽象类的指针或引用,以指向派生类的方法从而实现多态;
(3):抽象类的析构函数为纯虚函数,这样做的目的是当其一个派生类的实例离开作用域时(析构时),需要调用的缺省(默认)析构函数是引用对象中数据类型的析构函数。

(4):派生类实例对象时,类的初始化顺序:基类的静态成员、子类静态成员、基类成员变量、基类构造函数、子类成员变量、子类构造函数,子类析构函数、基类析构函数;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值