虚函数与纯虚函数有哪些区别?

zhangsongqi_0504 2004-12-21 08:37:33
虚函数与纯虚函数有哪些区别?
在写程序时怎样判断什么时候用虚函数,什么时候用纯虚函数?
...全文
2882 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
ywyw 2005-01-31
  • 打赏
  • 举报
回复
不错
DancingCode 2005-01-31
  • 打赏
  • 举报
回复
=0
llihua 2005-01-31
  • 打赏
  • 举报
回复
虚函数和纯虚函数在技术上只是一个“ = 0;”的区别。它们的主要区别还是在设计观念上。

当然纯虚函数还有一个附带作用就是防止其类实例化。
idau7 2005-01-09
  • 打赏
  • 举报
回复
虚基类,就是指含有纯虚函数的类洒,搞明白这点先.
debehe 2005-01-09
  • 打赏
  • 举报
回复
好像在哪里见过这些东西 呵呵
claus2001 2005-01-09
  • 打赏
  • 举报
回复
mark
Kshape 2005-01-09
  • 打赏
  • 举报
回复
虚函数是派生类"可以"修改的成员函数。
纯虚函数是派生类"必须"修改的成员函数。
cityvagrant 2005-01-09
  • 打赏
  • 举报
回复
纯虚函数只是定义了一个接口,要用它你是要实现的。
com里面到处是这个玩意。
xkxingkong 2005-01-08
  • 打赏
  • 举报
回复
经典
zyfhfx 2004-12-30
  • 打赏
  • 举报
回复
太经典了,向大家学习。呵呵
ac909 2004-12-22
  • 打赏
  • 举报
回复
纯虚函数是一种特殊的虚函数,它的一般格式如下:

class <类名>
{
virtual <类型><函数名>(<参数表>)=0;

};

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

#include <iostream.h>

class point
{
public:
point(int i=0, int j=0) { x0=i; y0=j; }
virtual void set() = 0;
virtual void draw() = 0;
protected:
int x0, y0;
};

class line : public point
{
public:
line(int i=0, int j=0, int m=0, int n=0):point(i, j)
{
x1=m; y1=n;
}
void set() { cout<<"line::set() called.\n"; }
void draw() { cout<<"line::draw() called.\n"; }
protected:
int x1, y1;
};

class ellipse : public point
{
public:
ellipse(int i=0, int j=0, int p=0, int q=0):point(i, j)
{
x2=p; y2=q;
}
void set() { cout<<"ellipse::set() called.\n"; }
void draw() { cout<<"ellipse::draw() called.\n"; }
protected:
int x2, y2;
};

void drawobj(point *p)
{
p->draw();
}

void setobj(point *p)
{
p->set();
}

void main()
{
line *lineobj = new line;
ellipse *elliobj = new ellipse;
drawobj(lineobj);
drawobj(elliobj);
cout<<endl;
setobj(lineobj);
setobj(elliobj);
cout<<"\nRedraw the object...\n";
drawobj(lineobj);
drawobj(elliobj);
}

抽象类

带有纯虚函数的类称为抽象类。抽象类是一种特殊的类,它是为了抽象和设计的目的而建立的,它处于继承层次结构的较上层。抽象类是不能定义对象的,在实际中为了强调一个类是抽象类,可将该类的构造函数说明为保护的访问控制权限。

抽象类的主要作用是将有关的组织在一个继承层次结构中,由它来为它们提供一个公共的根,相关的子类是从这个根派生出来的。

抽象类刻画了一组子类的操作接口的通用语义,这些语义也传给子类。一般而言,抽象类只描述这组子类共同的操作接口,而完整的实现留给子类。

抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类没有重新定义纯虚函数,而派生类只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体类了。
Henry0 2004-12-21
  • 打赏
  • 举报
回复
3,内联函数不能是虚函数,因为内联函数是不能在运行中动态确定其位置的。即使虚函数在类的内部
定义,编译时,仍将其看作非内联的。

因为内联是在编译期决定的,而且直接展开为代码,而虚函数是在运行期决定的
sunlu_eric 2004-12-21
  • 打赏
  • 举报
回复
虚函数的要求:
1,只有类的成员函数才能说明为虚函数,这是因为虚函数仅适用于有继承关系的类对象。
2,静态成员函数不能是虚函数,因为静态成员函数不受限于某个对象。
3,内联函数不能是虚函数,因为内联函数是不能在运行中动态确定其位置的。即使虚函数在类的内部
定义,编译时,仍将其看作非内联的。
4,构造函数不能是虚函数,因为构造时,对象还是一片未定型的空间。
5,析构函数可以是虚函数,而且通常声明为虚函数。

第三条,没有太明白!!!
jin_xiaolu2000 2004-12-21
  • 打赏
  • 举报
回复
看吧,给的多详细
xuzheng318 2004-12-21
  • 打赏
  • 举报
回复
除了继承外,C++的另一个优良特性是支持多态,即允许将派生类的对象当作基类的对象使用。如果A是基类,B和C是A的派生类,多态函数Test的参数是A的指针。那么Test函数可以引用A、B、C的对象。示例程序如下:
class A
{
public:
void Func1(void);
};

void Test(A *a)
{
a->Func1();
}

class B : public A
{

};
class C : public A
{

};

// Example
main()
{
A a;
B b;
C c;
Test(&a);
Test(&b);
Test(&c);
};

以上程序看不出“多态”有什么价值,加上虚函数和抽象基类后,“多态”的威力就显示出来了。
C++用关键字virtual来声明一个函数为虚函数,派生类的虚函数将覆盖(override)基类对应的虚函数的功能。示例程序如下:
class A
{
public:
virtual void Func1(void){ cout<< “This is A::Func1 \n”}
};

void Test(A *a)
{
a->Func1();
}

class B : public A
{
public:
virtual void Func1(void){ cout<< “This is B::Func1 \n”}
};
class C : public A
{
public:
virtual void Func1(void){ cout<< “This is C::Func1 \n”}
};

// Example
main()
{
A a;
B b;
C c;
Test(&a); // 输出 This is A::Func1
Test(&b); // 输出 This is B::Func1
Test(&c); // 输出 This is C::Func1
};

如果基类A定义如下:
class A
{
public:
virtual void Func1(void)=0;
};
那么函数Func1叫作纯虚函数,含有纯虚函数的类叫作抽象基类。抽象基类只管定义纯虚函数的形式,具体的功能由派生类实现。
结合“抽象基类”和“多态”有如下突出优点:
(1)应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。这一招叫“以不变应万变”,可以大大提高程序的可复用性(这是接口设计的复用,而不是代码实现的复用)。
(2)派生类的功能可以被基类指针引用,这叫向后兼容,可以提高程序的可扩充性和可维护性。以前写的程序可以被将来写的程序调用不足为奇,但是将来写的程序可以被以前写的程序调用那可了不起。
zhangsongqi_0504 2004-12-21
  • 打赏
  • 举报
回复
谢谢各位的指教!
向你们学习
dudu妈 2004-12-21
  • 打赏
  • 举报
回复
虚函数是动态联编的基础,属于包含多态类型,虚函数是非静态的成员函数,虚函数经过派生之后,在类族中就可以实现过程中得多态。虚函数的定义实际就是在原有的普通函数成员前面使用virtual关键字来限定,虚函数声明只能出现在函数原型声明中,而不能在成员的函数体实现的时候。
纯虚函数是一个在基类中说明得虚函数,他在该基类中没有定义具体的操作内容,要求各派生类根据实际需要定义自己的版本。实际上,他与一般虚函数成员在书写格式上的不同就在于后面加了"=0"。声明为纯虚函数之后,基类中就不再给出函数的实现部分。纯虚函数得函数体由派生类给出。
goodluckyxl 2004-12-21
  • 打赏
  • 举报
回复
抽象类:含有纯虚函数的类称为抽象类,virtual fun() = 0; 抽象类不能实力化.。它仅仅用来抽象出一层方法描述,不必实现,所以对其实例化没有任何意义。
如果我们不希望在类里出现某个对象的表现,利用抽象类可以推迟描述知道其某个派生类中。

而有虚函数的类是可以实例化,主要用于RTTI机制。实现多态

双杯献酒 2004-12-21
  • 打赏
  • 举报
回复
虚函数是派生类"可以"修改的成员函数。
纯虚函数是派生类"必须"修改的成员函数。
非常风子 2004-12-21
  • 打赏
  • 举报
回复
基类中不能为虚函数给出一个有意义的定义(不让基类的虚函数有任何的操作),这时可以将它说明成纯虚函数,它的定义留给派生类来做.纯虚函数的格式则在虚函数格式基础上末尾加=0.包含有纯虚函数的类称为抽象类。一个抽象类只能作为基类,由此基类再派生新类。一个抽象类不能有实例对象,即不能定义属于该类的对象。
加载更多回复(2)

64,648

社区成员

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

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