不使用virtual实现多态可以用成员函数指针完成。

成员函数指针形式:返回类型(A::*指针名)(形参表)

其中A是类类型,即这个指针是指向A类的成员函数的函数指针

例如:int(A::*P)(int,int)这是一个指向 “A类的带有两个int型形参且返回值是int的成员函数” 的指针,指针名是P。

下面是代码:

#include<iostream>
using namespace std;
class Base;
typedef int(Base::*p)();//定义成员函数指针类型
class Base
{
public:
p virtual_p;//成员函数指针
Base()
{
//初始化成员函数指针指向基类test
virtual_p = (int(Base::*)())&Base::test;
}
~Base(){}
int test()//判断virtual_p的指向,如果指向派生类test就返回派生类的test调用
{
if (virtual_p == &Base::test)
{
cout << "Base" << endl;
return ;
}
else
return (this->*virtual_p)();//返回派生类test调用,对virtual_p解引用后是test函数
}
};
class Derived :public Base
{
public:
Derived()
{
//初始化成员函数指针指向派生类test
virtual_p = (int(Base::*)())&Derived::test;
}
~Derived(){}
int test()
{
cout << "Derived" << endl;
return ;
}
};
int main()
{
Base *b;//基类指针
Derived d;//派生类对象
Base bb;//基类对象
//指向基类对象时调用基类test,指向派生类对象时调用派生类test,模拟了动态关联
b = &d;
cout << b->test() << endl;
b = &bb;
cout << b->test() << endl;
return ;
}

下面是运行结果:

C++ 不使用virtual实现多态的更多相关文章

  1. C++ polymorphism Virtual Function 多态 虚函数

    Polymorphism in C++ https://www.tutorialspoint.com/cplusplus/cpp_polymorphism.htm https://github.com ...

  2. C++ 多态、虚函数(virtual 关键字)、静态联编、动态联编

    函数重写:(在子类中重写父类中的函数) 父类中被重写的函数  依然会继承  给子类. 子类中重写的函数将覆盖父类中的函数. 通过作用域分辨符  ::  可以访问到父类中的函数. 例如: #includ ...

  3. C++解析(23):多态与C++对象模型

    0.目录 1.多态 2.C++对象模型 2.1 使用C语言实现封装 3.继承对象模型 4.多态对象模型 4.1 使用C语言实现多态 5.小结 1.多态 面向对象中期望的行为: 根据实际的对象类型判断如 ...

  4. 使用函数指针模拟C++多态

    #include <iostream> using namespace std; class Base { public : void display() { cout << ...

  5. C# 多态和接口

    1多态可以有属性,接口只有方法 2关键字不同,多态有静态多态(abstract)和动态多态(virtual),静态多态不能new()出自己,动态多态可以;多态中可以有自己的方法可设置不需要子类重写,接 ...

  6. 开通博客的第一天上传我的C#基础笔记,个人觉得很好用。

    1.索引器  string arrStr = "sddfdfgfh";  索引器的目的就是为了方便而已,可以在该类型的对象后面直接写[]访问该对象里面的成员  Console.Wr ...

  7. 转:C++的重载(overload)与重写(override)

    C++ override overload 的区别  override是指在不同作用域中,多个函数原型完全一样,而实现却不同的函数.在C++中,经常发生在类的继承中.当基类中的某个方法是virtual ...

  8. java中子类与父类中隐含的this引用的分析

    /* 看一下下面的程序,看是否你的答案和运行的答案是否一致! */ class Parent{ public int x; public Parent p; public Parent(){} pub ...

  9. C#中的多态现象

    面向对象的特征封装.继承和多态.Polymorphism(多态性)来源于希腊单词,指“多种形态”.多态性的一个重要特征是方法的调用是在运行时确定而不是编译时.在.NET中用于实现多态性的关键词有vir ...

随机推荐

  1. poj 1265 Area(Pick定理)

    Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5666   Accepted: 2533 Description ...

  2. linux 下查看网速的方法 (不需要安装任何软件)

    sudo watch -n 1 "/sbin/ifconfig eth0 | grep -E \"字节|数据包\"" 若是英文版linux: sudo watc ...

  3. 17 Great Machine Learning Libraries

    17 Great Machine Learning Libraries 08 October 2013 After wonderful feedback on my previous post on ...

  4. Caffe 编译

    Compilation Now that you have the prerequisites, edit your Makefile.config to change the paths for y ...

  5. Caffe 在 Ubuntu 中安装

    Ubuntu Installation General dependencies sudo apt-get install libprotobuf-dev libleveldb-dev libsnap ...

  6. hdoj 2816 I Love You Too

    I Love You Too Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  7. Android模拟器报"Failed To Allocate memory 8"错误的解决办法

    此错误是我们在允许AVD时,选择了默认的AVD插件所致. 解决方法:减少分配的内存大小.修改AVD的config.ini配置文件,将选项“hw.ramSize=1024”从1024改为256.

  8. Yii2 自动更新时间created_at updated_at

    创建model之后,新建一条记录,结果设计的表中created_at 字段 updated_at 字段 都是datetime 类型的,却不能自动插入当前时间.查看了资料,解决如下: 1.在class ...

  9. Ajax交互demo1

    一.概念 Ajax异步请求刷新. 浏览器在用户不知道的情况下,偷偷地跟服务器交互,然后返回数据给浏览器显示. 异步过程:当HTTP请求发送后,通过Ajax技术使用的XMLHttpRequest对象来发 ...

  10. 安卓开发中Theme.AppCompat.Light的解决方法

    styles.xml中<style name="AppBaseTheme" parent="Theme.AppCompat.Light">提示如下错 ...