c++虚函数实现动态绑定

c++规定 函数动态绑定 需要使用虚函数来实现。 具体的实现方法是:动态联编 使用对象的引用或对象的指针 来操作 虚函数,  但是如果使用对象 来操作虚函数的话,仍然会采用静态联编的方式。

#include<iostream>
using namespace std;
class A
{

public:
	virtual void printA()
	{
		cout<<"A:printA()"<<endl;
	}
};
class B :public A
{
public :
	virtual  void printA()
	{
		cout<<"B:printA()"<<endl;
	}
};
void printAB(A &aa)
{
	aa.printA();
}
int main()
{
    A a= A();
    B b= B();
    A *pab=b;//pab 表示是一个指针 是A 类型的 但是指向了B类对象
   // B *pba=a;  如果不注释起来 会报错 ,因为只可以用父类的指针 指向子类的对象;而子类的                  //  指针不可以指向父类的对象
    
    pab->printA();//通过对象的指针 来使用 虚函数,实现动态联编,结果会是 B:printA()
    //也可以使用 引用来对操作
     
     A &aa = b;
     printAB(aa);//效果与 aa.printA() 一样 都是 执行了 B:printA(); 
    
    return 0;
}

其实 之所以会有 动态联编这种模式的出现  ,就是因为 项目经理 会定义出 父类的操作,而员工 需要实现出 具体的 子类中与父类中对应的操作的实现, 而并不需要使用父类的操作, 所以动态联编的结果 基本上都是 使用 父类的指针或者引用 来指向或者引用 子类的对象,从而达到 实现子类操作的目的。

时间: 2024-10-13 02:19:09

c++虚函数实现动态绑定的相关文章

[转载]虚函数在构造函数中,已经失去了虚函数的动态绑定特性

class A { public: A() { Print(); } virtual void Print() { printf("A is constructed.\n"); } }; class B: public A { public: B() { Print(); } virtual void Print() { printf("B is constructed.\n"); } }; int _tmain(int argc, _TCHAR* argv[])

c++之虚函数(动态绑定技术)

 虚函数:    1.虚函数的思想借鉴于Simula语言,可以实现运行的多态.虚函数允许派生类重载.覆盖,即使访问对象所使用的指针类型是基类型,但依旧能调用派生类的相应函数.当使用对象指针或对象引用调用虚函数时,采用动态绑定技术. 2.virtual 关键字只能用在虚函数的声明中,在函数的定义中不能使用 class Shape{     public:    virtual void draw();};void Shape::draw(){cout<<"这是Shape->dra

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

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

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

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

虚函数 动态绑定 实现方式是:虚函数表

定义为 virtual的 函数是基类期待派生类(derived class)重定义的, 基类期待 派生类继承的函数不能定义为虚函数. 动态绑定:程序能 使用继承层次中任意类型的对象,无需关心对象的具体类型.  使用这些类的程序无须区分函数在基类还是在继承类中定义的. 尽管不是必须,派生类一般会重定义基类中的虚函数.如果没有重定义,则继承基类中定义的版本.派生类中虚函数的声明原型必须与基类中的定义方式完全匹配,但有一个例外:基类中返回值是对基类性的引用(或指针)的虚函数,在派生类中虚函数可以返回

JAVA – 虚函数、抽象函数、抽象类、接口

1. Java虚函数 虚函数的存在是为了多态. C++中普通成员函数加上virtual关键字就成为虚函数 Java中其实没有虚函数的概念,它的普通函数就相当于C++的虚函数,动态绑定是Java的默认行为.如果Java中不希望某个函数具有虚函数特性,可以加上final关键字变成非虚函数 PS: 其实C++和Java在虚函数的观点大同小异,异曲同工罢了. 2. Java抽象函数(纯虚函数) 抽象函数或者说是纯虚函数的存在是为了定义接口. C++中纯虚函数形式为:virtual void print(

静态成员函数与pthread_create,纯虚函数匹配使用实例

最近在浏览朋友写的代码,发现有一个细节非常值得学习,在这里将代码贴出来简单分享一下: #ifndef THREAD_H_ #define THREAD_H_ #include <pthread.h> #include <stdexcept> #include "Copyable.h" /* * 这个线程类是个抽象类,希望派生类去改写它 */ class Thread : public Copyable{ public: Thread(); virtual ~Th

C++ Primer 学习笔记33_面向对象编程(4)--虚函数与多态(一):多态、派生类重定义、虚函数的访问、 . 和-&gt;的区别、虚析构函数、object slicing与虚函数

C++ Primer学习笔记33_面向对象编程(4)--虚函数与多态(一):多态.派生类重定义.虚函数的访问. . 和->的区别.虚析构函数.object slicing与虚函数 一.多态 多态可以简单地概括为"一个接口,多种方法",前面讲过的重载就是一种简单的多态,一个函数名(调用接口)对应着几个不同的函数原型(方法). 更通俗的说,多态行是指同一个操作作用于不同的对象就会产生不同的响应.或者说,多态性是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为. 多态行分

6、多态性-3、虚函数

虚函数是动态绑定的基础.虚函数必须是非静态的成员函数,虚函数经过派生之后,在类族中就可以实现运行过程中的多态. 根据类型兼容规则,可以使用派生类的对象代替基类对象.如果用基类类型的指针指向派生类对象,就可以通过这个指针来访问该对象,问题是访问到的只是从基类继承来的同名成员.解决这一问题的办法是:如果需要通过基类的指针指向派生类的对象,并访问某个与基类同名的成员,那么首先在基类中将这个同名函数说明为虚函数.这样,通过基类类型的指针,就可以使属于不同派生类的不同对象产生不同的行为,从而实现了运行过程