我上一篇博客[C++的静态分发(CRTP)和动态分发(虚函数多态)的比较](http://www.cnblogs.com/fresky/p/3504241.html)介绍了如何用CRTP(Curiously Recurring Template Pattern)实现静态分发,今天再讲另外一个CRTP的例子。在C++中静态函数是不能设成virtual的,但是用CRTP可以实现静态函数的多态。

先看代码:

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
template<typename Derived>  class Parent
{
public:
void SayHi()
{
static_cast<Derived*>(this)->SayHiImpl();
}
void static SayHiStatic()
{
Derived::SayHiStatic();
}
private:
void SayHiImpl()
{
cout << "hi, i'm default!" << endl;
}
}; class ChildA :public Parent<ChildA>
{
public:
void SayHiImpl()
{
cout << "hi, i'm child A!" << endl;
}
void static SayHiStatic()
{
cout << "Static hi from Child A" << endl;
}
}; class ChildB :public Parent<ChildB>
{
public:
void static SayHiStatic()
{
cout << "Static hi from Child B" << endl;
}
};

 

和上次的代码类似,这次父类有一个静态的interface,两个子类分别实现了自己的静态实现。

再看调用静态 interface 的函数和 main 函数。

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template<typename Derived> void CRTP(Parent<Derived>& p)
{
p.SayHiStatic();
} int _tmain(int argc, TCHAR* argv[])
{
ChildA a;
CRTP(a);
cout << "size of ChildA: " << sizeof(a) << endl; ChildB b;
CRTP(b);
cout << "size of ChildB: " << sizeof(b) << endl; return 0;
}

 

运行可以得到如下输出:

1
2
3
4
Static hi from Child A
size of ChildA: 1
Static hi from Child B
size of ChildB: 1

用CRTP在C++中实现静态函数的多态的更多相关文章

  1. C语言中使用静态函数的好处

    C语言中使用静态函数的好处: 静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多. ???(对这个不是很理解)其实我觉得上面这种说法是错误的,它的主 ...

  2. C语言中static的作用及C语言中使用静态函数有何好处

    转自:http://www.jb51.net/article/74830.htm 在C语言中,static的作用有三条:一是隐藏功能,二是保持持久性功能,三是默认初始化为0. 在C语言中,static ...

  3. c#中的里氏转换和Java中强制类型转换在多态中的应用

    在c#中: 注意: 子类并没有继承父类的构造函数,而是会默认调用父类那个无参数的构造函数. 如果一个子类继承了一个父类,那么这个子类除了可以使用自己的成员外,还可以使用从父类那里继承过来的成员.但是父 ...

  4. C中的继承和多态

    昨天同学面试被问到这个问题,很有水平,以前都没有遇到过这个问题,一时自己也不知道怎么回答. 网上学习了一下,记录以备后用! C/C++ Internals : 里面的问题都写的不错,可以读读! Ref ...

  5. Python面向对象中的继承、多态和封装

    Python面向对象中的继承.多态和封装 一.面向对象的三大特性 封装:把很多数据封装到⼀个对象中,把固定功能的代码封装到⼀个代码块, 函数,对象, 打包成模块. 这都属于封装思想. 继承:⼦类可以⾃ ...

  6. cc38b_demo_C++_异常_(2)txwtech在异常中使用虚函数-多态

    //cc38b_demo,21days_C++_异常_(2)txwtech20200121在异常中使用虚函数-多态 //--异常层次结构//*异常的类-创建自己的异常类//*异常派生-就是继承//*异 ...

  7. java中的继承 和多态。

    package com.aaa.zxf.ajax.test; /** *一. java 中的继承和多态. * * 继承的特性? * 1.实现继承的方式 * A 如何建立继承关系(一个类继承于 另一个类 ...

  8. @selector 如何调用在另一个类中的静态函数?

    可以在同一个类的methodName这个函数中再调用另一个类中的静态方法

  9. Java 包装类中的静态函数

    所有的核心类型转化 全是基于这个图的 是不是很简单 so easy~~~ 不过下面的这些函数也是很重要的哦~~~ 以后就可以随意发挥了 猜API吧!

随机推荐

  1. 网易邮箱前端Javascript编码规范:基础规范

    在多年开发邮箱webmail过程中,网易邮箱前端团队积累了不少心得体会,我们开发了很多基础js库,实现了大量前端效果组件,开发了成熟的opoa框架以及api组件,在此向大家做一些分享.今天想先和大家聊 ...

  2. Poco库之XML操作

    平台ubuntu14.04LTS     Poco版本:Poco1.6.1 #include <Poco/DOM/Text.h>#include <Poco/DOM/Element. ...

  3. ConfigParser---python

    # !/usr/bin/python # Filename:tcfg.py import ConfigParser config = ConfigParser.ConfigParser() confi ...

  4. 斗地主你什么时候才会托管?(.NET中的托管于非托管)

    文章部分引自<.NET4.0面向对象编程漫谈(基础篇)>第1章.NET面向对象编程基础(作者:金旭亮) 无意间看到一位四五岁左右小朋友在玩斗地主,总开始到结束,她一直都在使用“提示”(托管 ...

  5. Forget asp.net membership,ASP.NET Identity Overview

    http://www.asp.net/identity http://www.asp.net/identity/overview/getting-started/introduction-to-asp ...

  6. UIApplication 常用方法

    下面是这个类的一些功能:1.设置icon上的数字图标 //设置主界面icon上的数字图标,在2.0中引进, 缺省为0 [UIApplicationsharedApplication].applicat ...

  7. EXCEL : We can't do that to a merged cell.

  8. Log4j与common-logging

    Log4j与common-logging 总网上搜了些Log4j与common-logging的介绍,记录下. 一.Log4j  1.简介 Log4j是Apache的一个开放源代码项目 使用Log4j ...

  9. 第 15 章 组合模式【Composite Pattern】

    以下内容出自:<<24种设计模式介绍与6大设计原则>> 大家在上学的时候应该都学过“数据结构”这门课程吧,还记得其中有一节叫“二叉树”吧,我们上 学那会儿这一章节是必考内容,左 ...

  10. 【BZOJ 1191】 [Apio2010]特别行动队 (斜率优化)

    dsy1911: [Apio2010]特别行动队 [题目描述] 有n个数,分成连续的若干段,每段的分数为a*x^2+b*x+c(a,b,c是给出的常数),其中x为该段的各个数的和.求如何分才能使得各个 ...