免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7945 | 回复: 18
打印 上一主题 下一主题

虚函数的作用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-15 14:28 |只看该作者 |倒序浏览
虚函数是为了实现多态,为什么要使用多态技术呢?小弟愚昧,只知道多态只是方便了泛型算法,因为有了多态的支持,所以可以定义出泛型的接口出来,不知多态还有何其他用途?还望达人指教。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
2 [报告]
发表于 2010-05-15 14:45 |只看该作者
多态是抽象的一种,而抽象是软件工程的根本目的之一。软件,实质上是把操作的流程转换为计算机能执行的代码。因此本质上转换的好坏取决于你能归结问题的根本的能力上。换句话说就是抽象问题的能力。

论坛徽章:
0
3 [报告]
发表于 2010-05-15 15:18 |只看该作者
小弟愚昧,只知道多态只是方便了泛型算法,因为有了多态的支持,所以可以定义出泛型的接口出来..
belefter 发表于 2010-05-15 14:28


完全错误~
泛型和多态完全是两回事。

泛型算法(至少在C++的实现)根本跟多态没关系。


虚函数是为了实现这样一个效果:
同名的函数调用实现不同的运算或者过程。

至于为什么要这样做,这个和程序设计思维、程序可扩展性有关。

多考虑软件设计问题,而不是算法实现问题可能比较好明白一点。

论坛徽章:
0
4 [报告]
发表于 2010-05-15 16:12 |只看该作者
回复 3# xyfree


    小弟觉得,泛型技术的本质是用相同的代码实现不同的功能,比如我们可以定义一个函数接口:
class father
{
public:
  virtual  void print(){cout<<"father";}
};
class son1:public father
{
public:
  void print(){cout<<"son1";}
};
class son2:public father
{
public:
  void print(){cout<<"son2";}
};
father *p1=new son1;
father *p2=new son2;
void func(father *p)
{
    p->print();
}
这样,当我们构造func函数的时候,不需要考虑传递进来的是p1还是p2,可以写出泛型技术的接口,用相同的代码实现不同的功能,不知小弟的这个例子是否恰当,有不正确之处,还望达人指出。

论坛徽章:
0
5 [报告]
发表于 2010-05-15 16:16 |只看该作者
回复 2# starwing83


    得教了,此话甚是有理,从程序设计的角度来看,着实有理

论坛徽章:
0
6 [报告]
发表于 2010-05-15 17:42 |只看该作者
[quote只知道多态只是方便了泛型算法belefter 发表于 2010-05-15 14:28 [/quote]

谁告诉你的?

论坛徽章:
0
7 [报告]
发表于 2010-05-15 19:53 |只看该作者
回复 6# baozhao


    是我表述不到位,应该是多态是一种泛型技术,倒不是谁告诉我的,是自己看到的

论坛徽章:
0
8 [报告]
发表于 2010-05-15 20:01 |只看该作者
虚函数是为了解决类因继承而衍生出的一系列问题的一个不太完善的解决方案。其主要目的是增加C++语言的复杂度,混淆C++学习者的思维。同时还有妨碍程序的底层调试,降低程序执行效率,方便黑客挂接Hook等等优良特性。

论坛徽章:
0
9 [报告]
发表于 2010-05-15 20:46 |只看该作者
从广义上是可以理解为泛型技术的

这个还要和继承结合起来用的

最简单的例子就是c#里面的Object.ToString()

任何类都通过覆写这个函数把它自己的信息转为字符串形式

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {
            Object o1 = 123;
            Object o2 = new DateTime(1990, 1, 1);
            Console.WriteLine(o1.ToString());
            Console.WriteLine(o2.ToString());
        }
    }
}

可以通过父类的引用直接调用子类的函数

论坛徽章:
0
10 [报告]
发表于 2010-05-15 21:45 |只看该作者
回复 4# belefter


    我能明白你想说什么,但是如果你把泛型和多态当成是相似的概念,那一定会让人笑死的。

    多态-> 虚函数,本质上是选择不同的函数。
    在你举的例子里面,就有3个源代码意义上同名的 print 函数

    father::print, son1::print, son2::print
   
    只是在你写出像 p->print(); 这样的代码的时候,编译器生成的代码使得这段代码具有选择函数的功能而已了。
    具体机制请参见 Inside the C++ Object Model

-------------

    泛型就比较多的实现方法了,Java的 C#的, Python的都不一样。

    但泛型和多态明显不一样的是,泛型不要求相关类型处于同一个继承树。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP