求教,C++类的三大特性:封装,继承,多态(动态绑定)的探讨!

kdush 2003-11-25 12:38:28
各位大哥,大姐。小弟学C++三个月了,我知道封装,继承,多态(动态绑定)在C++编程中有着非常重要的作用,可我现在对它们还不是很清楚。希望大家多多指教!
谢谢先!
...全文
1534 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
yunfengp 2003-11-28
  • 打赏
  • 举报
回复
在C++中是通过虚函数的应用和继承来实现多态的,从一个基类派生一个类,在基类中有虚函数,根据派生链,在运行期你定义了某一个派生实例,当然在派生实例中如果你重载了虚函数,运行期调用的就是你的重载板本,否则就是基类的版本,另外由基类的指针可以调用实例的实现而达到运行期的真正调用。
一路奔跑 2003-11-28
  • 打赏
  • 举报
回复
在每个有virtual的类里,都会很隐蔽的藏有一个virtualpoint(VPTR)指针,
每个指针指向一个VTABLE,VTABLE就是函数的地址,在Thinking in C++中有讲述。
fathappy 2003-11-27
  • 打赏
  • 举报
回复
c++支持两种多态性:静态多态和动态多态,
静态多态是通过重载实现的,动态多态是通过虚函数实现的.

如果用一个基类指针指向一个衍生类的对象,但用该指针只能访问基类所定义的成员函数.
为了解决这个问题,就引入虚函数的概念.
cgsw12345 2003-11-27
  • 打赏
  • 举报
回复
多态性是不是就是虚函数(virtual)来实现的呀?
------------------------------------
C++的多态性是通过函数重载来实现的,
--------------------------
上的觀點是錯誤的正確為: C++的多態是通過指針來實現。
kdush 2003-11-26
  • 打赏
  • 举报
回复
呵呵,大家谁写点代码说明一下呀?今天我是没时间了,明天继续!
呵呵,各位晚安!
zhouqingyuan 2003-11-26
  • 打赏
  • 举报
回复
究竟想知道什么呢,来个具体的问题好不好
kdush 2003-11-26
  • 打赏
  • 举报
回复
真不好意思,我这个问题是太泛泛了,细一想,真是不好讨论。
不过我的本意是想让大家都来说说对这三大特性的理解,以及个人独到的见解。最终达到共同进步的目的。看来我的提问是有些不托,没有达到预期的效果。
那我们就着重讨论一下多态吧。
一路奔跑 2003-11-26
  • 打赏
  • 举报
回复
#include "iostream.h"
#include "conio.h"
class A
{
private:
int a;
public:
A(int k){a=k;};
virtual int B(){return a;};
};
class B
{
private:
int a;
public:
B(int k){a=k;};
virtual int C(){return a;};
virtual void play(){cout<<"a="<<a<<endl;};
};
class C
{
private:
int a;
public:
C(int m){a=m;};
void play(){cout<<"a="<<a<<endl;};
};
int main(int argc, char* argv[])
{
cout<<"Size of a int is:"<<sizeof(int)<<endl;
cout<<"Size of a void* is:"<<sizeof(void*)<<endl;
cout<<"Size of a A class is:"<<sizeof(A)<<endl;
cout<<"Size of a B class is:"<<sizeof(B)<<endl;
cout<<"Size of a C class is:"<<sizeof(C)<<endl;
//如有虚函数自动增加一个VPTR指针;
getch();
return 0;
}
这个列子可以告诉你virtual函数 跟其他函数有什么不同

至于为什么需要virtual函数来做区别,我想你应该自己找列子看,关键是要仔细想。
其实我也是菜鸟一个
xjy521 2003-11-26
  • 打赏
  • 举报
回复
随便找一本C++的书都有,
xjy521 2003-11-26
  • 打赏
  • 举报
回复
up
Tommy 2003-11-26
  • 打赏
  • 举报
回复
2:继承的本质是实现代码重用,因而继承机制能缩短软件的开发周期,加快编程速度

在《设计模式》中,继承基本上是用于实现一个接口,而不是为了实现代码重用。
nirvana_li 2003-11-26
  • 打赏
  • 举报
回复
这样讨论好乱哦,建议楼主把三个分开来,还有问题太泛了,泛泛而谈的东西没有意思...
fqcd555 2003-11-26
  • 打赏
  • 举报
回复
参与!!!呵呵!
kdush 2003-11-25
  • 打赏
  • 举报
回复
呵呵,我先顶一下吧!
我还要问问,多态性是不是就是虚函数(virtual)来实现的呀?
linaren 2003-11-25
  • 打赏
  • 举报
回复
前两个我就不说了
关于多态:
也就是C++的”运行时识别类型“的机制,比如继承了某个接口的两个实现类
用父类的指针指向他俩时,在即时运行时,编译器可以是那一个类的实例对象,也就调用相应的方法
qufan 2003-11-25
  • 打赏
  • 举报
回复
在学习这个部分给我印象最深的是:
基类指针可以指向它的派生类的实例(对象)
这样给一个函数(可以是一个普通函数)传递一个基类的指针,在传递一个实例时
可以根据类的不同调用不同的响应函数(当然这个函数一般为虚函数)
还有函数重载和操作符重载,你可以为自己的类定义一个实用的new和delete
这样在大量的产生类对象可以更好的节省内存
sungengyu 2003-11-25
  • 打赏
  • 举报
回复
天天都讨论这些问题。翻翻以前的帖子,多看看书,不就有了。
等到具体某个地方不会的时候再来问,效果会好一点。
现在一大群人唧唧喳喳的你也听不出个数来。
笨笨2011 2003-11-25
  • 打赏
  • 举报
回复
简而言之,多态就是对一个相同接口的调用会产生不同的行为。例如,基类是CShape,然后从这个基类派生出CCircle(圆),CRetangle(矩形),CLine(线)三个不同的类。基类定义了一个虚拟函数draw(),表示派生类中会有绘图的动作,三个派生类尽管都有draw()函数并且参数、返回值类型都一样,但是有各自的行为特性。程序中有这样一段代码:定义了一个CShape类型的指针,然后这个指针会被赋值,接着调用draw()函数。我们知道,基类指针是可以指向派生类对象的。在编译时我们不确定这个指针会被赋予什么类型的指针值——可能是CCircle类的,也可能是CRetangle类型的。由于draw()是虚拟函数,因此可以根据在运行时指针的类型调用不同的类中的虚拟函数(动态绑定)。
罗嗦了半天,汗~~~~~~~~~~~。一句话,多态是由虚拟函数与动态绑定实现的
hjf1010 2003-11-25
  • 打赏
  • 举报
回复
虚函数就是为多态准备的,不又多态,虚函数没有意义,还多占内存。
关于函数重载,在Java中介是为多态的一种,在c++中,函数重载就是函数重载,不是多态,定义是不一样的,C++中的多态性实现明确区别于函数重载。
继承在其他面向对象语言里就是为了代码复用,但在C++中对于多态性也是必须的,因为多态是在不同层次的类中实现的,即继承含有虚函数的基类,在子类中重新定义虚函数。
kdush 2003-11-25
  • 打赏
  • 举报
回复
to hanfeichunan(亚历山大)
为什么
class B : public A
{};
B一定要有多态的性质,否则就是滥用继承
能说的明白点么?
面向对象编程的真正威力不仅仅是继承,它具有把派生类的对象当作基类对象的能力。支持这一点的机制就是多态性和动态绑定。
多态性允许派生类对象传递给接受指向基类的引用或指针的函数,接受这种对象的函数就是多态函数。

加载更多回复(9)

64,682

社区成员

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

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