浅谈C++的virtual 动态绑定。

我们知道C++里 virtual函数可以用来实现多态。继承类可以实现自己的功能来覆盖基类。比如下面这段代码

#include<iostream>
#include<string>
using namespace std;
class BaseA{
public:
    BaseA(string n):name(n){}
    string getName() const;
    virtual void showMyName() const;
    string name;
};

class DerivedA:public BaseA{
public:
    DerivedA(string n):BaseA(n){}
    string getName() const;
    virtual void showMyName() const;
};

string BaseA::getName() const
{
    cout<<"base static"<<endl;
    return name;
}

void BaseA::showMyName() const
{
    cout<<"base:"<<name<<endl;
}

string DerivedA::getName() const
{
    cout<<"derived static"<<endl;
    return name;
}

void DerivedA::showMyName() const
{
    cout<<"derived:"<<name<<endl;
}

int
main()
{
    DerivedA * derivedA = new DerivedA(string("abcd"));

    BaseA baseA = * derivedA; //会调用copy constructor函数

    baseA.showMyName();
    baseA.getName();

    BaseA * pBaseA = derivedA;
    pBaseA->showMyName();
    pBaseA->getName();

    return 0;
}

这段代码的输出:

base:abcd
base static
derived:abcd
base static

我们来解读一下:

BaseA baseA = * derivedA;  这里其实是构造了一个BaseA类,也就是构造了一个基类,虽然是右值是继承类。但这里会调用BaseA的default copy assignment函数,构造一个BaseA的实例。derivedA会被截断。那么当然了
  baseA.showMyName();
  baseA.getName();这俩行会调用BaseA的函数。

我们再看一下下面这行
BaseA * pBaseA = derivedA;这里声明了一个BaseA的指针 然后把指针指向派生类 DerivedA的一个实例。
再看下面的代码pBaseA->showMyName();
pBaseA->getName();showMyName我们定义成了Virtual,也就是在内存里会有个函数指针,指向不同的实现。对于derivedA来说,这个函数的指针当然是指向DerivedA的showMyName。而pBaseA拿到的是derivedA的指针,那么当然调用的函数也会是DerivedA的实现函数。这个就是所谓的动态绑定。

下面再看getName,相对于动态绑定函数,这是个静态函数,什么事静态函数呢,就是这个函数会根据对象的静态类型来调用。比如pBaseA的静态类型是BaseA,那么pBaseA所调用的就是BaseA的getName。
 
时间: 2024-10-07 21:56:43

浅谈C++的virtual 动态绑定。的相关文章

浅谈C#中new、override、virtual关键字的区别

OO思想现在已经在软件开发项目中广泛应用,其中最重要的一个特性就是继承,最近偶简单的学习了下在设计模式中涉及到继承这个特性时,所需要用到的关键字,其中有一些关键点,特地整理出来. 一.New 在C#中,new这个关键字使用频率非常高,主要有3个功能: a)   作为运算符用来创建一个对象和调用构造函数. b)   作为修饰符. c)   用于在泛型声明中约束可能用作类型参数的参数的类型. 在本文中,只具体介绍new作为修饰符的作用,在用作修饰符时,new关键字可以在派生类中隐藏基类的方法,也就说

浅谈web应用的负载均衡、集群、高可用(HA)解决方案(转)

1.熟悉几个组件 1.1.apache     —— 它是Apache软件基金会的一个开放源代码的跨平台的网页服务器,属于老牌的web服务器了,支持基于Ip或者域名的虚拟主机,支持代理服务器,支持安 全Socket层(SSL)等等,目前互联网主要使用它做静态资源服务器,也可以做代理服务器转发请求(如:图片链等),结合tomcat等 servlet容器处理jsp.1.2.ngnix     —— 俄罗斯人开发的一个高性能的 HTTP和反向代理服务器.由于Nginx 超越 Apache 的高性能和稳

浅谈为什么只有指针能够完成多态及动态转型的一个误区

c++多态由一个函数地址数组Vtable和一个指向Vtable的指针vptr实现. 具体来说,类拥有自己的vtable,类的vtable在编译时刻完成. 每个对象有自己的vptr指针,该指针初始化时指向对象所实现的类的vtable. 关于向上转型的误区: 通常对于向上转型的理解是这样的,当子类对象向上转型(允许隐式)成父类对象时,实际上只是将子类对象暂时看做父类对象,内部的数据并未改变. 对于没有虚函数的对象,这句话是正确的,但是,当引入虚函数后,这样的理解是有问题的,实际上,向上转型的过程中,

浅谈委托和事件(一)

浅谈委托和事件(一) 关于委托和事件,可能是.NET或者说是面向对象编程语言中的一个比较重要又比较难以理解的概念.关于这一话题,园子里的人也写了很多文章,最经典的可能就是张子阳的C#中的委托和事件这两篇文章了,之前也看过MSDN 上的WebCast深入 "委托和事件".可能和很多人一样,刚开始读的时候,觉得很清楚,但是过了一段时间好像又忘记了委托和事件的区别,知道很久以前,在一次面试中我被问到委托和事件有什么区别,一下子就说不清了. 所以这里稍微理一下,也算是自己的一个总结.当然,还是

浅谈C++多态性(转载)

转载:http://blog.csdn.net/hackbuteer1/article/details/7475622 C++编程语言是一款应用广泛,支持多种程序设计的计算机编程语言.我们今天就会为大家详细介绍其中C++多态性的一些基本知识,以方便大家在学习过程中对此能够有一个充分的掌握. 多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念.多态(polymorphisn),字面意思多种形状. C++多态性是通过虚函数来实现的,虚函数允许子

浅谈C# 多态的魅力(虚方法,抽象,接口实现)

浅谈C# 多态的魅力(虚方法,抽象,接口实现) 分类:             asp.net             C#              2014-02-08 11:29     786人阅读     评论(0)     收藏     举报 浅谈C# 多态的魅力(虚方法,抽象,接口实现) 前言:我们都知道面向对象的三大特性:封装,继承,多态.封装和继承对于初学者而言比较好理解,但要理解多态,尤其是深入理解,初学者往往存在有很多困惑,为什么这样就可以?有时候感觉很不可思议,由此,面向

浅谈Tomcat

浅谈Tomcat 随着java的流行,其在web上的应用也越来越广,tomcat作为一个开源的servlet容器,应用前景越来越广,本文将向你讲述tomcat的一些知识. 一:简介tomcat是jakarta项目中的一个重要的子项目,其被JavaWorld杂志的编辑选为2001年度最具创新的java产品(Most Innovative Java Product),同时它又是sun公司官方推荐的servlet和jsp容器(具体可以见http://java.sun.com/products/jsp/

浅谈 GetHashCode

我们知道,System.Object 类是 .NET Framework 中所有类的最终基类,它是类型层次结构的根,并为派生类提供低级别服务.通常不要求类声明从 Object 的继承,因为继承是隐式的.因为 .NET Framework 中的所有类均从 Object 派生,所以 Object 类中定义的每个方法可用于系统中的所有对象.派生类可以而且确实重写这些方法中的某些,其中包括: Equals - 支持对象间的比较. Finalize - 在自动回收对象之前执行清理操作. GetHashCo

蚂蚁变大象:浅谈常规网站是如何从小变大的(八)(转)

原文:http://blog.sina.com.cn/s/blog_6203dcd60100y1vi.html          [第十一阶段 :命名位置服务]   在前面我们不止一次提到了命名位置服务(Naming & Location Service).在不同的架构或者公司里面,这个名字往往不一样,比如,在java里面叫JNDI(Java Naming & Directory Interface),在有些地方可能会叫做资源位置系统(Resource Location System).