C实现C++的多态性,呵呵......

有以下两个C++类:

class Base {
public:
   Base(int a, int b) : m_a(a), m_b(b) {}
   virtual void Func1();
   virtual int Func2();
private:
   int m_a, m_b;
}

class Derived : public Base {
public:
   Derived(int a, int b, double d) : Base(a, b), m_d(d) {}
   virtual int Func2();
private:
   double m_d;
}

模拟通常C++编译器的实现机制,用C语言给出Base、Derived的定义,并实现两个类的创建代码:

typedef void** VtblPtr;
struct base_t
{
   VtblPtr _vtbl;
   int m_a;
   int m_b;
};

struct derived_t
{
   VtblPtr _vtbl;
   int m_a;
   int m_b;
   double m_d;
};

//new Base时
base_t * pBase = malloc( sizeof(base_t) );
pBase -> _vtbl[0] = & _base_t_Func1;
pBase -> _vtbl[1] = & _base_t_Func2;
_base_t_Base( pBase, a, b ); 

//new Derived时
derived_t * pDerived = malloc(sizeof(derived_t) );
pDerived -> _vtbl[0] = &_base_t_Func1;
pDerived -> _vtbl[1] = &_derived_t_Func2;

//derived_t的构造函数
void _derived_t_Derived( derived_t*pDerived, int a, int d)
{
   _base_t_Base( (base_t*)pDerived, a, b);
   pDerived -> m_d = d;
}
时间: 2024-08-04 11:28:20

C实现C++的多态性,呵呵......的相关文章

Java多态性的“飘渺之旅”

原文出处:斯武丶风晴 摘要: 如何从Java多态性进行飘渺之旅呢? 我们用例子来旅行. 1 朵星人A:人类,是一个很奇妙的物种. 2 朵星人B:他们好像分为两种,嗯 先生,以及美女? 3 朵星人C:对,更年轻的有叫 美少女的. 4 朵星人D:他们之间怎么打招呼的?我们问问AI(编译器大佬)吧.. 5 朵星人A:可以有.启动吧~ 第一次启动: 1 /** 2 * 编译时多态 3 * 4 * @author Sven Augustus 5 */ 6 public class StaticTest {

Java 多态性理解

什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式.(发送消息就是函数调用) 实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法.特别注意:当所引用的类型存在继承关系时候,会结合参数的类型,选择相应的方法.可以结合

java 多态性详解及常见面试题

java多态性 多态分两种: (1)   编译时多态(设计时多态):方法重载. (2)   运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态.(我们平时说得多的事运行时多态,所以多态主要也是指运行时多态) 运行时多态存在的三个必要条件: 一.要有继承(包括接口的实现): 二.要有重写: 三.父类引用指向子类对象. 多态的好处: 1.可替换性(substitutability).多态对已存在代码具有可替换性.例如,多态对圆Circle类工作,对其他任

多态性与虚函数

多态性 多态性是面向对象程序设计的一个重要特征.如果一种语言只支持类而不支持多态,是不能被称为面向对象语言的.只能说是基于对象的,如Ada,VB就属于此类. 在C++程序设计中,多态性是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数. 在面向对象方法中一般是这样表述多态性的:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法).也就是说,每个对象可以用自己的方式去相应共同的消息.所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的

对象多态性

基本概念的解释. 多态性的依赖条件是方法的覆写!! 观察如下的一个程序: class A{ public void print(){ System.out.println("A--print()") ; } } class B extends A{ public void print(){ System.out.println("B--print()") ; } } public class Test{ public static void main(String

谷歌那让人“呵呵”的图像技术

其实,谷歌在图像技术方面没搞明白的,可不仅仅只是libjpeg的optimize_mode参数那么简单. 跟安卓系统在图像内存管理方面的“糊涂”比起来,图片品质还真算不上个事,质量差点大家还能忍,内存管理不当则会导致应用的崩溃(OOM :Out of Memory)可就真没人能忍了.   Bitmap很占内存,那到底会占多少内存呢?计算起来很简单,如果你需要显示一个长宽均为612个像素的正方形图片,对应的Bitmap对象需要612*612*4=1498176个字节的内存,即大约不到1.5MB的内

C++多态性与虚函数

面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为.在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数体.也可以这样说就是实现了"一个接口,多种方法". 从实现的角度来讲,多态可以分为两类:编译时的多态性和运行时的多态性.前者是通过静态联编来实现的,比如C++中通过函数的重载和运算符的重载.后者则是通过动态联编来实现的,在C++中运行时的多态性主要是通过虚函数来实现的. 赋值兼容     不过在说虚函数之前,先介绍一个有关

第十三周阅读项目(4):多态性与虚函数

(1)代码: #include <iostream> using namespace std; class Vehicle //交通工具 { public: void run() const { cout << "run a vehicle. "<<endl; } }; class Car: public Vehicle //汽车 { public: void run() const { cout << "run a car.

C++之多态性与虚函数

面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为.在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数体.也可以这样说就是实现了“一个接口,多种方法”. 从实现的角度来讲,多态可以分为两类:编译时的多态性和运行时的多态性.前者是通过静态联编来实现的,比如C++中通过函数的重载和运算符的重载.后者则是通过动态联编来实现的,在C++中运行时的多态性主要是通过虚函数来实现的,也正是今天我们要讲的主要内容. 1.不过在说虚函数之前,我想先介