多态性 与 静态绑定

#include<iostream>
using namespace std;

class A
{
public:
void foo()
{
printf("1\n");
}
virtual void fun()
{
printf("2\n");
}
};
class B : public A
{
public:
void foo()
{
printf("3\n");
}
void fun()
{
printf("4\n");
}
};
int main(void)
{
A a;
B b;
A *p = &a;
p->foo(); //1 不是虚函数,静态绑定,根据指针类型,编译期决定调用的函数
p->fun(); //2 是虚调用,迟绑定,调用基类的func()

p = &b;
p->foo(); //1 不是虚函数,静态绑定,根据指针类型,编译期决定调用的函数
p->fun(); // 4 是虚调用 迟绑定,调用子类的fun()

B* ptr = (B*)&a;
ptr->foo(); // 3 不是虚函数,静态绑定,根据指针类型,编译期决定调用的函数
ptr->fun(); // 2 虚函数迟绑定,调用基类的fun()
return 0;
}

时间: 2024-08-23 20:59:04

多态性 与 静态绑定的相关文章

C++之虚函数和多态

干货较多-需要自己深思理解: C++支持两种多态性: 1.编译时多态性(静态绑定-早绑定) 在程序编译阶段即可以确定下来的多态性 通过使用 重载机制(重载函数)实现 (模板)http://blog.csdn.net/my_business/article/details/12194691 2.运行时多态性(动态绑定-晚绑定) 必须等到程序运行时才能确定的多态性 要通过 虚函数 来实现 http://blog.csdn.net/zp752963831/article/details/4663588

(C++)C++多态性中的静态绑定和动态绑定

静态绑定和动态绑定是C++多态性的一种特性. 1.对象的静态类型和动态类型: 对象的静态类型: 对象在声明是采用的类型,在编译期确定: 对象的动态类型: 当前对象所指的类型,在运行期决定,对象的动态类型可以更改,但静态类型无法更改. class B{ }; class C: public B{ }; class D: public B{ }; D* pD=new D(); // pD的静态类型是它声明的类型D*,动态类型也是D* B* pB=pD; // pB的静态类型是它声明的类型B*,动态类

【转】深入理解C++的动态绑定和静态绑定 &amp; 不要重定义虚函数中的默认参数

为了支持c++的多态性,才用了动态绑定和静态绑定.理解他们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误.需要理解四个名词:1.对象的静态类型:对象在声明时采用的类型.是在编译期确定的.2.对象的动态类型:目前所指对象的类型.是在运行期决定的.对象的动态类型可以更改,但是静态类型无法更改.关于对象的静态类型和动态类型,看一个示例: class B { } class C : public B { } class D : public B { } D* pD = new D();//p

深入理解C++的动态绑定和静态绑定

转自:http://blog.csdn.net/chgaowei/article/details/6427731 为了支持c++的多态性,才用了动态绑定和静态绑定.理解他们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误.需要理解四个名词:1.对象的静态类型:对象在声明时采用的类型.是在编译期确定的.2.对象的动态类型:目前所指对象的类型.是在运行期决定的.对象的动态类型可以更改,但是静态类型无法更改.关于对象的静态类型和动态类型,看一个示例: 1 class B 2 { 3 } 4

方法是动态绑定的,属性是静态绑定的

 package com.test; /** * @FileName    : B.java * @Description : 复习下:帮助你理解方法是动态绑定,属性是静态绑定的 * @Copyright   : PowerData Software Co.,Ltd.Rights Reserved * @Company     : XXXXX * @author      : 星辰 * @version     : 1.0 * Create Date  : 2014-9-5 下午04:57:

C# 多态性

C# 多态性 多态:一个接口多个功能. 静态多态性:编译时发生函数响应(调用): 动态多态性:运行时发生函数响应. 静态绑定(早期绑定):编译时函数和对象的连接机制. 两种技术实现静态多态性:函数重载/运算符重载. 函数重载:在同一范围内对相同函数名有多个定义,可以是参数类型或参数个数的不同,但不许只有返回值类型不同. 运算符重载: 关键字 abstract 声明抽象类:用于接口部分类的实现(派生类继承抽象类时,实现完成).抽象类包含抽象方法,抽象方法可被派生类实现. 抽象类规则: 1.不能创建

Java中的重载、重写、多态,静态绑定、动态绑定

重载,英文名是overload,是指在一个类中定义了一个以上具有相同名称的方法,这些方法的参数个数.参数类型和顺序不能相同.返回类型可以相同,也可以不同. public class TstaticOverload { static int height; TstaticOverload() { System.out.println ("Planting a seedling"); height = 0; } TstaticOverload(int initialHeight) { he

C++中虚函数的动态绑定和多态性

目录 静态类型VS动态类型,静态绑定VS动态绑定两组概念 虚函数的实现机制 多态性 一.静态 vs 动态 静态类型 VS 动态类型.静态类型指的是对象声明的类型,在编译器确定的.动态类型指的是对象的所指向的类型,动态类型是可以更改的,静态类型无法更改.继承关系会导致对象的指针和引用具有静态类型和动态类型,因为继承关系的存在中可能会存在类型之间的向上向下类型转换.静态绑定 VS 动态绑定.某特性(函数)依赖与对象的静态类型,在编译期确定,某特性(函数)依赖于对象的动态类型,在运行期确定.只有通过基

第八章:多态性

主要内容: 1.多态性 2.运算符重载 3.虚函数 4.纯虚函数 5.抽象类 多态实现: --函数重载 --运算符重载 --虚函数 限制:有些运算符是不可重载的,重载基本是改变操作对象,有基本类型转为user-defined类型. 实现机制:运算表达式==>运算符函数,运算对象==>运算符函数的实参 形式:1.重载为类成员函数,此时 参数个数=原操作数-1(后置++,--除外) 2.重载为友元函数,此时  参数个数 = 原操作数个数,至少有一个用户自定义类型的形参. 声明形式: 函数类型  o