请问在C++中友元是啥? 还有虚函数是啥?

S海鸥 2004-04-29 09:20:05
请问在C++中友元是啥? 还有虚函数是啥?
它们在什么时候用到? 有什么作用? 请举例? 谢!
...全文
135 16 点赞 打赏 收藏 举报
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Wolf0403 2004-04-30
请问在C++中友元是啥? 还有虚函数是啥?
1、friendship 2、virtual function
它们在什么时候用到? 有什么作用? 请举例? 谢!
1、在编程的时候用到。作用:增加了复杂度。例子:如果没有它们就没有这个帖子了。
  • 打赏
  • 举报
回复
cyy219 2004-04-30
注意:基类成员可以调用派生类中重新定义的虚函数,但构造函数却只能调用本类中定义的虚函数,而不能调用派生类中重新定义的虚函数,因为当时可能还没有建立派生类的对象。
??能不能举个例子说明一下?
  • 打赏
  • 举报
回复
liushl2001 2004-04-30
顶起!!
  • 打赏
  • 举报
回复
liem 2004-04-30
什么是友元?所谓友元就是经授权,可以访问本类私有成员的外部函数(非本类成员函数)
授权方式:在本类中用friend声明
  • 打赏
  • 举报
回复
hslinux 2004-04-30
HOHOHO~~~~~~~~~~~~~~~~~~
  • 打赏
  • 举报
回复
jmlt1983 2004-04-30
简单点就是,虚拟函数只是告诉你将会有些什么样的方法(函数)在基于这个抽象接口上实现,具体方法不再此接口中实现

friendship就是这个函数不是此类的成员函数,他不能访问此类中封装的数据,但是当他加入了friend声明之后,他就可以访问这些已经封装的数据。很多的经典的计算机图书中都说它破坏了类的封装性,不过这也不是什么不好的,毕竟c++实现了很多的面向对象的大胆尝试,而且为了兼容c,当然有很多不是很纯的“面向对象”。友元就是这样

  • 打赏
  • 举报
回复
Wolf0403 2004-04-30
如果把“告知施工队房子的地址”这个过程当作一个“工厂模式”,那么 C++ 的虚函数更像是一个“抽象工厂模式”。客户代码要求一个函数调用,工厂返回的不是一个对象,而是一个能够产生最后对象的工厂(虚表),再从这里得到最后的产品(函数地址)
  • 打赏
  • 举报
回复
hardstudylulin 2004-04-30
给大家讲个刷房子的故事,将来开公司可能会应用这种思想:
有一家装潢公司接到一个给房子刷油漆的大单子,很大的单子,可能有10000间房子需要刷不同颜色的油漆。如果你是老板,你会如何合理调配你的资源?以最小的成本、最快的速度,完成任务!你会想到把的施工队分成n(颜色数)队,当你接到任务后,先获知房子的颜色,派出相对应的施工队,同时给他们房子的地址,和一些附加信息。这样你的施工队将会很高效的运作起来,事物因分类而简单。

故事中你的角色相当于虚函数机制的分配者,而你分配的正是实现者的指针。
  • 打赏
  • 举报
回复
cai114 2004-04-29
虚函数可减小代码量,
友元可方问一些private.
  • 打赏
  • 举报
回复
lj197912 2004-04-29
如果需要通过基类的指针指向派生类的对象,并访问某个与基类同名的成员,那么首先要在基类中把这个同名函数说明为虚函数,这样可以实现多态
  • 打赏
  • 举报
回复
sueprljy 2004-04-29
楼上已经有人说的很清楚了,如果楼主想进一步了解友元和虚函数,建议找一些例子来讨论讨论,彼此学习。
  • 打赏
  • 举报
回复
lj197912 2004-04-29
友元类
class B
{
...
friend class A;//声明A为B的友元类

....
};
若A 为B的友元类,那么A类的所有成员函数都是B的友元函数,都可以访问B的私有和保护成员
  • 打赏
  • 举报
回复
RichardSong2003 2004-04-29
楼上这位老兄讲得很好,很受启发!!!
  • 打赏
  • 举报
回复
lj197912 2004-04-29
友元提供了不同类或对象的成员函数之间、类的成员函数于一般函数之间进行数据共享的机制 。通过友元,一个普通函数或者类的成员函数可以访问到封装于某一类中的数据。
class point
{
public:
point(int xx=0,int yy=0){x=xx;y=yy;}
friend float fdist(point &a,point &b);
private:
int x,y;
};
float fdist(point &p1,point &p2)
{
double x=double(p1.x-p2.x);//友元函数可以通过对象名访问类的私有和保护成员
......
  • 打赏
  • 举报
回复
shadow22 2004-04-29
以C++中,我们是通过将一个函数定义成虚函数来实现运行时的多态的。如果一个函数被定义为虚函数,那么,即使是使用指向基类对象的指针来调用该成员函数,C++也能保证所调用的是正确的特定于实际对象的成员函数。

如果类c1,c2...由基类base派生而来,base有一个用virtual修饰的公有或保护函数成员f(),而在c1,c2...中的一些类中重新定义了成员函数f(),而对f()的调用都是通过级基类的对象或指针进行的,在程序执行时才决定是调用c1还是c2或其它派生类中定义的f()。这样的函数f()称为虚函数。
让我们通过以下的例子来理解虚函数的概念:
class base {
public:
virtual void f();
};
class derived : public base {
... //没有重定义f()
};
class derived1 : public derived {
public:
void f();
}
下面是调用的例子,注意可用成员名强制实行静态联编。
derived1 d1;
derive& d=d1;
d.f(); //调用derived1::f()
base& b=d1;
b.f();//调用derived1::f()
d.derived::f();//调用base::f()
b.base::f();//调用base::f()

派生类中重新定义的虚函数,不论访问权限是什么,都可被动态联编。
例如:
class base {
public:
virtual void f();
}
class derived : public base {
private:
void f();
}
虽然派生类derived中函数成员f()是私有的,但不影响以下的访问:
derived d;
base& b=d;
b.f();//调用derived::f()

注意:基类成员可以调用派生类中重新定义的虚函数,但构造函数却只能调用本类中定义的虚函数,而不能调用派生类中重新定义的虚函数,因为当时可能还没有建立派生类的对象。
  • 打赏
  • 举报
回复
shadow22 2004-04-29
友元可以是一个函数,该函数称为友元函数;友元也可以是一个类,该类被称为友元类。 1、友元函数 友元函数是能够访问类中的私有成员的非成员函数。
#include <iostream.h>

#include <math.h>

class Point

{

public:

Point(double xx,double yy) { x=xx;y=yy;}

void Getxy( );

friend double Distance(Point &a,Point & b);

private:

double x,y;

};

void Point::Getxy( )

{

cout<<”(“<<x<<”,”<<y<<”)”<<endl;

}

double Distance(Point &a,Point &b)

{

double dx=a.x-b.x;

//对象的私有成员一般只有成员函数才能访问,这里友元函数中允许访问对象的

//私有成员

double dy=a.y-b.y;

return sqrt(dx*dx+dy*dy);

}

void main( )

{

Point p1(3.0,4.0),p2(6.0,8.0);

p1.Getxy( );

p2.Getxy( );

double d=Distance(p1,p2);

cout<<”Distance is”<<d<<endl;

}

输出结果:

(3,4)

(6,8)

Distance is 5

说明:该程序中的Point类中说明了一个友元函数Distance( ),它在说明时前面加上了friend关键字,标示它不是成员函数,而是友元函数。但是,它可以引用类中的私有成员,函数体中a.x,b.x,a.y,b.y都是类的私有成员,它们是通过对象引用的。在调用友元函数时,与普通函数的调用一样,不需要像成员函数那样调用。本例中,p1.Getxy()和p2.Getxy( )这是成员函数的调用,因此要用对象来表示。而Distance(p1,p2)是友元函数的调用,它可直接调用,不需要用对象表示。但如果在友元函数中处理数据成员,都必须使用对象参数。
  • 打赏
  • 举报
回复
相关推荐
发帖
C++ 语言
加入

6.0w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
帖子事件
创建了帖子
2004-04-29 09:20
社区公告
暂无公告