C++利用纯虚函数和虚函数实现接口继承和实现继承

C++的纯虚函数导致声明它的类成为抽象类,即不可以实例化,派生于这个基类的类必须重新声明所有的纯虚函数。通常纯虚函数不在基类中定义,所以派生类实际上是继承了这些纯虚函数形式的接口,它告诉派生类:你必须实现这些纯虚函数的接口,但是具体的实现方式我不干涉,由你决定!例如在绘图基类Shape中有一个纯虚函数为draw,对于正方形、圆形等要求必须有一个对应的draw函数,但具体的draw由具体的派生类决定,基类函数只是告诉你必须声明和定义这个draw函数。

当然,纯虚函数在基类中也是可以定义的,但对它的调用需要由类名进行指定,例如:

1 Shape* re = new Rectangle;
2 re->Shape::draw();


相对于纯虚函数,一般的虚函数通常会在基类定义中有具体的实现,它为各个派生类提供缺省时的实现,它的调用方式同普通成员函数的调用方式。

而对于一般的非虚函数,它通常表明各个派生类在这个函数中的行为并没有什么不同,在派生类中不需要也不应该重新实现。

相对于继承接口和继承实现的概念来讲,纯虚函数具体指继承接口,一般的虚函数具体指继承接口和缺省的实现,而一般的非虚函数则是强制派生类继承接口和几乎不需要重新定义得实现。或者可以这样理解,虚函数为派生类提供特化的空间,而非虚函数则代表所有派生类不变的那部分。

 

以上整理自Effective C++中文版第三版 case 34.

转载于:https://www.cnblogs.com/sophia-yun/archive/2013/06/04/3117806.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
虚函数纯虚函数都是C++语言中面向对象的概念,它们的作用是支持多态性和动态绑定。但是,虚函数纯虚函数之间还是有一些区别的。 1. 虚函数是一个可以被继承类重写的函数,而纯虚函数是一个没有实现的函数,必须由继承实现。 2. 虚函数可以有实现,也可以没有实现,而纯虚函数必须没有实现。如果一个类中有纯虚函数,那么这个类就是抽象类,不能被实例化。 3. 如果一个派生类没有实现其基类中的纯虚函数,那么它也是一个抽象类,不能被实例化。 4. 如果一个类中有虚函数,那么这个类的对象会包含一个虚函数表指针,虚函数表中存储着虚函数的地址。在运行时,程序会根据对象的类型来确定调用哪个虚函数,这就是动态绑定。而纯虚函数也会在虚函数表中有一个条目,但是没有实现,需要由继承实现。 下面是虚函数纯虚函数的示例代码: ```c++ class Animal { public: virtual void MakeSound() { // 基类中的虚函数 cout << "Animal makes sound!" << endl; } virtual void Eat() = 0; // 基类中的纯虚函数 }; class Cat : public Animal { public: virtual void MakeSound() { // 派生类中的虚函数 cout << "Cat meows!" << endl; } virtual void Eat() { // 派生类中实现纯虚函数 cout << "Cat eats fish!" << endl; } }; int main() { Animal* pAnimal = new Cat(); // 基类指针指向派生类对象 pAnimal->MakeSound(); // 调用派生类的虚函数 pAnimal->Eat(); // 调用派生类实现纯虚函数 return 0; } ``` 在上面的示例代码中,Animal是一个抽象基类,其中有一个虚函数MakeSound和一个纯虚函数Eat。Cat是Animal的一个派生类,重写了MakeSound虚函数实现了Eat纯虚函数。在main函数中,通过基类指针指向派生类对象,实现了多态性和动态绑定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值