C++-抽象类的函数实现什么时候会用到?

发布于 2017-01-24 04:03:51 字数 156 浏览 1333 评论 6

class Base
{
public:
void fun1() = 0; // 纯虚函数,抽象类

void fun2()
{
cout << "fun2" << endl;
}
};

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

想挽留 2017-10-06 03:37:43

C++的抽象类的作用就像C#和java里面的接口一样,纯虚函数就是接口函数,原则上抽象类中的函数都应该定义为纯虚函数的
1. 如果所有的派生类对应的那个纯虚函数都会有相同的实现,当然可以在这个抽象类中实现这个纯虚函数(C#和java不行)。
2. 如果对应的纯虚函数各个派生类要实现不同的函数内容的话就不能在抽象类中实现,具体要到各个派生类中实现。

泛泛之交 2017-08-30 21:32:39

一般定义一个含有纯虚函数的类的时候都是用作基类的。其中的几个函数是定义为纯虚函数。但是也有的虚函数是提供实现的。主要的因为有的时候派生类并不需要这个函数有特殊实现。有的情况下用不到这种函数。在visitor设计模式中,基类中就会出现这种有自己默认实现的虚函数。主要作用就是不需要派生类非得实现。如果是纯虚函数的话,派生类就必须实现一份,无论是否需要

清晨说ぺ晚安 2017-07-13 18:52:06

抽象类提供虚函数,主要是为了达到运行时多态的效果。因为在程序运行的时候,会根据一个对象的实际类型来调用虚函数。如果抽象类中实现了虚函数,那么有些子类就不必再去实现该虚函数了,只有需要改变该函数实现过程的子类才需要重新实现虚函数。
这样做其实也是为了达到代码重用的目的。如果一个基类的动作,大部分子类的实现都是一样的,只有少部分子类的实现不一样,那么就可以把这个实现放到基类里面,那么这样就只有那些少数的实现不一样的子类需要实现这个虚函数了。
举个例子:有一个“animal”的基类,其子类有“cat”,“dog”,“rat”,“bird”,其中只有“bird”的act()是“fly”,其他的都是“walk”。那么对于这个类层次结构来说,为了实现多态,就需要把act()设为虚函数,但是也只有“bird”的实现不同,所以就可以在基类"animal"中把act()函数实现为“walk”,那么就只需要在“bird”子类中重写act()函数,其他子类就不用了。示例代码如下:

 #include <iostream>
using namespace std;

class animal
{
public:
virtual void act()
{
cout << "walk" << endl;
}
};

class cat: public animal {};

class dog: public animal {};

class rat: public animal {};

class bird: public animal
{
void act()
{
cout << "fly" << endl;
}
};

int main()
{
animal* a[4] = {new cat, new dog, new rat, new bird};
for (int i = 0; i < 4; i++)
a[i]->act();
return 0;
}

运行结果如下:

从结果中可以看出,“cat”,“dog”,“rat”的act()都是输出“walk”,也就是基类的默认实现,而“bird”的act()输出“fly”,是因为“bird”重新实现了“act”函数。

清晨说ぺ晚安 2017-05-17 10:37:15

子类没必须重写父类方法的时候,就不如直接用父类的。

归属感 2017-04-17 00:33:52

一般抽象基类就是包含了纯虚函数的类,提供纯虚函数的目的就是让子类去实现(子类也必须去实现),进而实现多态。正是因为需要实现多态才去定义这样的函数,所以,你是因为需要才去定义的,如果不需要,就不要去定义这样的函数了。

夜无邪 2017-04-09 18:19:42

有一种情况下是必须实现的,就是当基类的纯虚函数是虚析构函数的时候,该纯虚析构函数必须定义实现。否则编译会报错!

class Base
{
public:
virtual ~Base() = 0; // 必须在源文件中对该类进行定义,否则编译会报错
virtual void fun1() = 0;

void fun2()
{
cout << "fun2" << endl;
}
};

至于其他要实现的情况,是要看设计者的意图的,就算纯虚函数被实现了,也只能被静态的调用(statically invoked),不能由实例化的对象来调用。例如像这样:

 class Derived:public Base
{
Derived();
fun()
{
Base::fun(); // 调用基类实现的纯虚函数
}
};

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文