纯虚函数一定不能在基类中定义吗?看图中为啥实现了 ?

方紫涵 2013-11-19 05:29:51
今天在网上看到一篇文章,对他写的这个地方有点疑问:看图



问下
1)那个纯虚函数为什么要实现?不实现可以不?
2)这个类是不是接口类?抽象基类和接口类有什么关系 ?

...全文
1076 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
随风_ltw 2014-08-20
  • 打赏
  • 举报
回复
实现纯虚函数是因为,一部分派生类必须要重新定义这个虚函数,而一部分派生类可以直接通过Base::pure_virtual_func()来使用基类默认实现的方法
lm_whales 2013-11-20
  • 打赏
  • 举报
回复
抽象类的纯虚函数未必不会实现,只是一般抽象类不去实现。
lm_whales 2013-11-20
  • 打赏
  • 举报
回复
C++ 用抽象类,通常用抽象类做接口类
zsq765561964 2013-11-20
  • 打赏
  • 举报
回复
纯虚函数出现的目的就是因为无法在基类中给出确切的定义,如果能定义,有何必声明为纯虚函数
ztenv 版主 2013-11-20
  • 打赏
  • 举报
回复
纯虚函数一般情况无实现,但如果在派生类中调用了纯虚函数就会出问题,加上实现就是为了避免。
xiaohuh421 2013-11-20
  • 打赏
  • 举报
回复
纯虚就是说派生类必须实现, 但是如果基类都实现了,派生类就不必须实现了,那还叫什么纯虚
Vegertar 2013-11-20
  • 打赏
  • 举报
回复
#7 正解。 纯虚可以有内容。 定义成纯虚,表示你必须覆盖,有纯虚体,就提示你可能需要它的内容作为前置调用。
Adol1111 2013-11-20
  • 打赏
  • 举报
回复 1
如果是普通的基类,派生类可以完全不重新定义这个虚函数,直接使用基类的虚函数,但纯虚函数就不行了。 对于纯虚函数来说,你可以实现他也可以不实现他,但是纯虚函数会强调让派生类覆盖这个虚函数。也就是说派生类必须有自己的虚函数,而不能直接继承基类(抽象类)的纯虚函数,却不定义自己的。否则自己仍然是一个抽象类,不能实例化。 当然如果你实现了这个纯虚函数,可以用 基类::虚函数 的形式来访问他。比如:
#include<iostream>
using namespace std;
class A{
public:
	virtual void display() =0
	{
		cout<<"A"<<endl;
	}
};

class B:public A{
public:
	virtual void display()
	{
		A::display();
		cout<<"B"<<endl;
	}
};

int main(){
	B b;
	b.display();
	return 0;
}
方紫涵 2013-11-20
  • 打赏
  • 举报
回复
引用 7 楼 Adol1111 的回复:
如果是普通的基类,派生类可以完全不重新定义这个虚函数,直接使用基类的虚函数,但纯虚函数就不行了。 对于纯虚函数来说,你可以实现他也可以不实现他,但是纯虚函数会强调让派生类覆盖这个虚函数。也就是说派生类必须有自己的虚函数,而不能直接继承基类(抽象类)的纯虚函数,却不定义自己的。否则自己仍然是一个抽象类,不能实例化。 当然如果你实现了这个纯虚函数,可以用 基类::虚函数 的形式来访问他。比如:
#include<iostream>
using namespace std;
class A{
public:
	virtual void display() =0
	{
		cout<<"A"<<endl;
	}
};

class B:public A{
public:
	virtual void display()
	{
		A::display();
		cout<<"B"<<endl;
	}
};

int main(){
	B b;
	b.display();
	return 0;
}
good
忘世麒麟 2013-11-20
  • 打赏
  • 举报
回复
引用 楼主 xwhbwas2008 的回复:
1)那个纯虚函数为什么要实现?不实现可以不? 2)这个类是不是接口类?抽象基类和接口类有什么关系 ?
纯虚函数不一定要实现,哪怕在子类中不实现父类的纯虚函数也是可以的,这个时候子类还是虚基类。 是不是接口类看设计者的想法,一般C++中把虚基类当作接口的情况也是有的。抽象基类和接口类没有必然联系。
jun_for_linux 2013-11-20
  • 打赏
  • 举报
回复
那个人的写法是正确的。 如果一定要说原因,那就是良好的编程习惯了。 毕竟纯虚函数也是函数,有个{}很正常。
qq120848369 2013-11-20
  • 打赏
  • 举报
回复
可以实现纯虚函数,主要是有人在构造函数里调用纯虚函数,但基类先于派生类构造,导致只能调到基类的纯虚函数,如果没有实现的话那就搞不定了。
dllg1988 2013-11-19
  • 打赏
  • 举报
回复
纯虚函数如果不实现,则无法实例化对象 C++里好像没接口类这个概念,个人倾向于把接口类理解成只含有纯虚函数的类,比如com接口。上述基类是抽象类,不算接口类
方紫涵 2013-11-19
  • 打赏
  • 举报
回复
引用 1 楼 xihu1364 的回复:

纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。
在许多情况下,在基类中不能对虚函数给出有意义的实现:
版主大哥 2013-11-19
  • 打赏
  • 举报
回复
1.估计那人写错了,不用实现。 2.抽象基类与接口类联系: 相同点 都可以被继承。 本身都不能被实例化 不同点 抽象类是一个不完整的类,需要进一步细化;而接口只是一个行为上的规范。 抽象基类不能实现多继承,而接口可以实现多继承。 抽象基类可以定义字段、属性、包含有实现的方法。接口可以定义字段、索引器、事件但不能定义字段和包含实现的方法。
版主大哥 2013-11-19
  • 打赏
  • 举报
回复

纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧