虚函数(动态绑定)对于 OO/C++的重要性

虚函数(动态绑定)对于 OO/C++来说是主要的吗?

是的!

没有虚函数,C++ 就不是面向对象的了。算符重载和非虚成员函数很好,但毕竟,它们只是更典型的C概念中传递一个struct的指针给函数的句法装饰而已。虽然标准库包含了许多模板以实现同样非常好的“泛型编程(译注:也称通用编程,"generic programming")”技术,但虚函数仍然是用C++进行面向对象编程的核心。

从商业角度看,如果没有虚函数,那么也就没有什么理由要从传统的 C 转移到C++了。(在本FAQ中我们将忽略泛型编程和标准库)。技术人员通常认为在C和非面向对象的C++之间有很大的区别,但如果没有面向对象,这个区别通常不足以证明培训开发者,新工具等的成本是值得的。换句话说,如果我被某个经理征询意见,是否从C转向非面向对象的C++(也就是说,转换语言而不转换典范),那么我可能会劝阻他这样做,除非有逼不得已的面向工具的原因。从商业角度看,面向对象能使系统具有可扩展性和可适应性,但只有C++类的语法而没有面向对象的话,就不会减少维护成本,而实际上会增加培训成本。

底线:没有虚函数的C++不是面向对象。用类编程而没有动态绑定则称为“基于对象”,而不是“面向对象”。踢出虚函数和踢出OO(译注:即面向对象)是一回事。所剩下的就是基于对象编程了,和最初的Ada语言类似(顺便说一下,新的Ada语言支持OO而不是基于对象编程了)。

时间: 2024-09-27 23:25:11

虚函数(动态绑定)对于 OO/C++的重要性的相关文章

C++中的纯虚函数(pure virtual) 和抽象基类(abstract base class)

纯虚函数(pure virtual), 是一个基类中的方法, 仅仅是声明, 而不包括定义, 是一个泛化概念(general concept); 是把相应的虚函数, 末尾添加"=0",该虚函数就变为纯虚函数, 可以不用添加定义; 如果是其他虚函数, 即使不使用, 也必须定义(define); 包含纯虚函数的基类, 是抽象基类(abstract base class),不能定义(define)对象(object), 仅可以作为继承使用; 代码: /* * CppPrimer.cpp * *

C++中如何在容器中使用继承和虚函数

容器不支持混合类型, 如果直接把派生类对象, 存入基类容器中, 则无法使用派生-基转换(derived-base conversion); 因为转换只能发生在指针和引用 过程中, 不能发生在 对象直接赋值, 如果是直接转换, 则会产生截断(sliced down); 即派生类部分被切除, 只留下基类部分; 所以存入容器中的派生类 输出为基类部分 的虚函数; 如果想在容器中, 进行继承, 则需要使用指针, 包括智能指针(如:shared_ptr<>), 则会输出派生类的覆写(override)版

C++:虚函数(virtual function)缺省参数的异常表现及正确使用

避免定义基类(base class)虚函数的缺省参数, 如果基类虚函数包含缺省参数, 派生类不要重新定义, 会产生异常; 虚函数(virtual)是动态绑定(dynamically bound),缺省参数是静态绑定(statically bound). 如果派生类(derived class)重新定义缺省值, 实例化, 执行函数正常; 但在动态绑定时, 会出现,执行基类的缺省参数, 却是派生类的行为, 这样的异常举动. talk is cheap, show you the code. 注意观察

避免对派生的非虚函数进行重定义

今天无意中发现一个关于C++基础的问题,当时愣是没理解是什么原因,现在搞明白了,就写下来了 .先看小程序,先实践再理论吧,要不大家就睡着了. #include <iostream> using namespace std; class Base { public: virtual void funtion(int arg = 1){cout<<arg<<endl;} }; class Derive : public Base { public: virtual void

虚函数与多态小览

一.文章来由 Bill又写文章来由了哇~~早就想好好搞清这个问题了,这是c++领域里面比较难搞定的一块知识点,而且最近在看设计模式,里面有涉及这块,之前学过的不用容易玩忘记,于是就干脆研究透一点,也好碰到.用到的时候不心慌~于是有了这篇文章. 二.从编译时和运行时说起 2.1 编译时: 顾名思义就是正在编译的时候.就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字节码,C#中只有CLR能识别的MSIL)

基础:C++中的虚函数和纯虚函数用法

1. 虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称抽象类 2. 虚函数可以被直接使用,也可以被子类(sub class)重载以后以多态的形式调用,而纯虚函数必须在子类(sub class)中实现该函数才可以使用. 3. 虚函数和纯虚函数都可以在子类(sub class)中被重载,以多态的形式被调用. 4. 虚函数和纯虚函数通常存在于抽象基类(abstract base class -AB

[面试题]虚函数和纯虚函数

①虚函数 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有"多种形态",这是一种泛型技术.        如果调用非虚函数,则无论实际对象是什么类型,都执行基类类型所定义的函数.非虚函数总是在编译时根据调用该函数的对象,引用或指针的类型而确定.如果调用虚函数,则直到运行时才能确定调用哪个函数,运行的虚函数是引用所绑定或指针所指向的对象所属类型定义的版本. 虚函数必须是

Way on c &amp;amp; c++ 小记 [八] – 自底向上地探究虚函数

自底向上地探究虚函数 作者:Jason Lee @http://blog.csdn.net/jasonblog 日期:2010-05-19 环境:Visual C++ Express2008 声明:本文发表在csdn博客,如有转载,请注明出处   [1]C++对象模型基础 一个类中可以包含静态数据成员.静态成员函数.非静态成员函数和非静态数据成员以及虚函数.其中,前三者(静态数据成员.静态成员函数.非静态成员函数)都并没有被放到对象的布局中,可以从以下两段代码得到验证: #include <io

C++:多态之虚函数

            一个面向对象的系统常常要求一组具有相同基本语义的方法能在同一接口下为不同的对象服务,这就是多态性(polymorphism).           通俗的来说,多态就是在一个方法在不同基类的派生类中表现出不同的实现形式.比如,定义水果类为基类,苹果,梨,香蕉为派生类,在水果类,苹果,梨,香蕉中都有一个计算蒸发率的成员函数,但是,在苹果,梨,香蕉中,因为他们是不同水果,有不同蒸发率,所以,虽然同样是计算蒸发率,但是计算的方法不同,这种用不同方法计算不同派生类蒸发率的方式就是