请教!

yuyunliuhen 2008-02-28 05:42:03
两个有什么不同?
template<typename T>
class CBase
{
static int i;
};
class A:public CBase<A>//继承的时候将本类的类型作为”参数“传入,这样做有啥好处?
{
};
class B:public CBase<A>
{
};


class CBase
{
static int i;
};
class A:public CBase
{
};
class B:public CBase{
};


这个算法的时间是多少?
template<int N,bool b>
class C;
template<int N>
class C<N,true>
{ enum{result=N+C<N-1,N-1%3==0>::result};
template<int N>
class C<N,false>{ enum{result=0+C<N-1,N-1%3>::result};
template<>
class C<0,true>{enum{result=0}};
mian()
{
printf("%d",C<1000,1000%3==0>::result);
}


两个面试题,各位把自己的想法说一下吧?谢谢!
...全文
127 7 打赏 收藏 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuyunliuhen 2008-02-28
  • 打赏
  • 举报
回复
谢谢各位。
努力ING!
  • 打赏
  • 举报
回复

template<class T>
class Base1
{
public:
void func()
{
T* p = static_cast<T*>(this);
p->Doing();
}
};
class Base2
{
public:
void Doing()
{
}
void otherfunc()
{
}
};

class test:public Base1<test>,public Base2
{
public:
//void Doing(){};
};
int main()
{
test t;
t.func();
return 0;
}

假设test 提供 Base2提供了一些功能,Base1提供了一些功能。然后Base需要派生类提供一个Doing的函数。
而Base2中正好有,这样就可以直接调用到Base2的Doing,如果test对Base2提供的函数不满,直接自己写上一个Doing即可。
没有了虚函数,这种做法就是静态多态。
在ATL中运用的非常多。
hastings 2008-02-28
  • 打赏
  • 举报
回复

这个算法的时间是多少:1
baihacker 2008-02-28
  • 打赏
  • 举报
回复
第二个是编译时确定的...不需要花费运行时时间
p0303230 2008-02-28
  • 打赏
  • 举报
回复
晕
帮顶
baihacker 2008-02-28
  • 打赏
  • 举报
回复

//编译时虚函数调用
//来源:
//原作 :Michael Dunn [英文原文]
//翻译 :Orbit(桔皮干了) [http://www.winmsg.com/cn/orbit.htm]
ATL-style 模板
即使你能够毫不费力地阅读C++的模板类代码,仍然有两件事可能会使你有些头晕,以下面这个类的定义为例:

class CMyWnd : public CWindowImpl<CMyWnd>
{
...
};
这样作是合法的,因为C++的语法解释说即使CMyWnd类只是被部分定义,类名CMyWnd已经被列入递归继承列表,是可以使用的。将类名作为模板类的参数是因为ATL要做另一件诡秘的事情,那就是编译期间的虚函数调用机制。

如果你想要了解它是如何工作地,请看下面的例子:

template <class T>
class B1
{
public:
void SayHi()
{
T* pT = static_cast<T*>(this); // HUH?? 我将在下面解释

pT->PrintClassName();
}
protected:
void PrintClassName() { cout << "This is B1"; }
};

class D1 : public B1<D1>
{
// No overridden functions at all
};

class D2 : public B1<D2>
{
protected:
void PrintClassName() { cout << "This is D2"; }
};

main()
{
D1 d1;
D2 d2;

d1.SayHi(); // prints "This is B1"
d2.SayHi(); // prints "This is D2"
}
这句代码static_cast<T*>(this) 就是窍门所在。它根据函数调用时的特殊处理将指向B1类型的指针this指派为D1或D2类型的指针,因为模板代码是在编译其间生成的,所以只要编译器生成正确的继承列表,这样指派就是安全的。(如果你写成:

class D3 : public B1<D2>
就会有麻烦) 之所以安全是因为this对象只可能是指向D1或D2(在某些情况下)类型的对象,不会是其他的东西。注意这很像C++的多态性(polymorphism),只是SayHi()方法不是虚函数。

要解释这是如何工作的,首先看对每个SayHi()函数的调用,在第一个函数调用,对象B1被指派为D1,所以代码被解释成:

void B1<D1>::SayHi()
{
D1* pT = static_cast<D1*>(this);

pT->PrintClassName();
}
由于D1没有重载PrintClassName(),所以查看基类B1,B1有PrintClassName(),所以B1的PrintClassName()被调用。

现在看第二个函数调用SayHi(),这一次对象被指派为D2类型,SayHi()被解释成:

void B1<D2>::SayHi()
{
D2* pT = static_cast<D2*>(this);

pT->PrintClassName();
}
这一次,D2含有PrintClassName()方法,所以D2的PrintClassName()方法被调用。

这种技术的有利之处在于:

不需要使用指向对象的指针。
节省内存,因为不需要虚函数表。
因为没有虚函数表所以不会发生在运行时调用空指针指向的虚函数。
所有的函数调用在编译时确定(译者加:区别于C++的虚函数机制使用的动态编连),有利于编译程序对代码的优化。
节省虚函数表在这个例子中看起来无足轻重(每个虚函数只有4个字节),但是设想一下如果有15个基类,每个类含有20个方法,加起来就相当可观了。


  • 打赏
  • 举报
回复
1
静态多态可以在Base中将this指针通过static_cast转化为派生类指针,调用派生类方法。
2
编译期计算。算法时间为0
源码链接: https://pan.quark.cn/s/a4b39357ea24 微信小程序是由腾讯公司设计的一种轻量级应用开发平台,主要面向移动设备,旨在为用户带来无需下载安装即可直接使用的应用服务体验。在微信小程序的开发实践中,"模仿美团菜单 swiper分类菜单"是一项常见的技术应用,其目的是达成与美团外卖应用相似的交互模式,使用户能够轻松地浏览和挑选各种商品或服务。 在微信小程序的技术体系中,`swiper`组件属于轮播图功能模块,通常用于呈现多张图片或卡片式的切换界面,能够达成动态滑动展示不同分类菜单的功能。在模拟美团菜单的应用情境下,`swiper`组件一般与`swiper-item`组件协同工作,每一个`swiper-item`对应一个分类,用户可通过左右滑动来切换不同的分类菜单。 为了达成这样的功能,首先需要在微信小程序的`json`配置文档中引入`swiper`组件,并在`wxml`结构文档中构建相应的布局代码,将每个分类以`swiper-item`的形式进行组织。同时,需要在`wxss`样式文档中定义恰当的样式,保证分类菜单的视觉呈现符合设计规范。 接下来,我们将在`js`逻辑文档中处理`swiper`的切换逻辑,通过监听`bindchange`事件来识别当前选中的分类,并根据这一信息动态获取对应的子菜单信息。为了达成类似美团的层级菜单功能,可能还需要借助`picker`或`navigator`组件来展示二级分类或商品详情。 在开发阶段,需要关注以下关键点: 1. 数据绑定:保证数据与界面之间的双向链接准确无误,以便在选择分类时即时更新显示内容。 2. 动态加载:针对大量数据,可能需要采取异步加载机制,防止一次性加载过多内容引发性能瓶颈...
代码下载地址: https://pan.quark.cn/s/72bd50ecb2fb 《微信飞机大战素材详解》 微信飞机大战作为一款广受欢迎的休闲游戏,凭借其便捷的操作方式和紧张刺激的游戏过程,赢得了众多用户的青睐。本文将系统性地剖析这款游戏的关键素材,旨在帮助开发者全面掌握游戏的设计理念与实现方法。 我们聚焦于游戏的核心构成——"AirplaneResource"。此名称一般指向游戏资源库,其中收纳了游戏中所有的视觉素材、音频资料以及动画元素。在微信飞机大战的语境下,这些资源构成了游戏画面呈现、音效播放和动态效果的基础。 1. **图像素材**:游戏中的飞机造型、敌方单位、弹药以及爆炸效果等视觉元素,均以图像素材的形式进行展示。图像素材通常涵盖PNG或JPG格式的静态图片,也包括GIF或APNG格式的动态图片。开发者需要细致地设计并优化这些图像,确保在各种设备上都能实现流畅的渲染,同时维持视觉表现力。 2. **声音素材**:游戏的背景音乐、射击音效、爆炸声等音频片段,对于构建游戏氛围具有决定性作用。这些音频文件可能以MP3、WAV或OGG格式进行存储,开发者需要权衡音频的压缩程度与音质,以确保在不牺牲游戏体验的前提下,有效控制文件体积。 3. **动画序列**:飞机的飞行轨迹、攻击动作、爆炸过程等动态表现,通常借助序列帧动画技术实现。这些序列帧图片组合而成的动画,通过编程控制播放速率和顺序,为游戏增添生动的动态效果。 4. **物理接触判定**:游戏中飞机与弹药之间的接触判定,是通过算法完成的。开发者可能会采用基础的矩形接触判定或更精密的像素级接触判定,以保证游戏的公平性和挑战性。 5. **游戏规则**:微信飞机大战的得分机制、生命值系统、敌机生成逻辑等...

65,213

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧