以下是小编帮大家整理的一个C++继承、虚函数和多态性的实例代码,本文共6篇,欢迎大家分享。

篇1:一个C++继承、虚函数和多态性的实例代码
#include
#include
using namespace std;
namespace Animals {
class Dog {
private:
string name;
public:
Dog(string name) : name(name) {
}
Dog : name(NULL) {
}
virtual void bark() {
cout << “Baseclass: Hi, ” << name << endl;
}
string getName() {
return name;
}
void setV(string aname) {
name = aname;
}
};
class SDog : public Dog {
public:
SDog(string name) : Dog(name){}
virtual void bark() {
Dog::bark();
cout << “Dericed Class: Hi, ” << Dog::getName() << endl;
}
};
}
int main() {
using namespace Animals;
Dog a(“martin”);
SDog b(“merry”);
a.bark();
b.bark();
return 0;
}
篇2:C语言中调用Lua函数实例
这篇文章主要介绍了C语言中调用Lua函数实例,本文讲解了调用一个Lua函数的步骤和C语言调用Lua函数实例,需要的朋友可以参考下
记得上学时,初中英文课本中,上网叫做surfing the internet,中文叫网上冲浪,那个时期,人们经常称互联网为赛博空间。如今工作了,大量的零碎时间用于上微博,知乎,QQ,这些碎片化的阅读让人读起来轻松,也能获取些粗浅的信息。然而它们是消耗时间的黑洞,时间就这样一分一秒地飞逝,年末的时候,知乎会告诉你回答了多少问题,阅读了相当于一部《红楼梦》那么多的文字。只是当你静下来一想,这些浅阅读并没给你带来有深度,系统的知识。在你的时间线上,两条相邻信息往往是八竿子也打不着的。而且你还时不时去看看关注者有没有更新,期待让你眼前一亮的信息。结果往往是趁兴而去,败兴而回。屏幕上的信息永无止境地滚动着,是如此的热闹,仿佛每个人都在狂欢,而我的内心却如此的空虚与孤独。
在lua API中,调用一个函数的步骤很简单:
1.压入你要调用的函数,使用lua_getglobal。
2.压入调用参数。
3.使用lua_pcall
4.从栈中弹出结果。
举例说明,假设你有这么一个lua函数:
代码如下:
function f (x, y)
return (x^2 * math.sin(y))/(1 - x)
end
那么,我们就可以定义个c函数来封装这个调用:
代码如下:
/* call a function ‘f‘ defined in Lua */
double f (double x, double y)
{
double z;
lua_getglobal(L, “f”);
lua_pushnumber(L, x);
lua_pushnumber(L, y);
/* do the call (2 arguments, 1 result) */
if (lua_pcall(L, 2, 1, 0) != 0)
error(L, “error running function ‘f‘: %s”,
lua_tostring(L, -1));
if (!lua_isnumber(L, -1))
error(L, “function ‘f‘ must return a number”);
z = lua_tonumber(L, -1);
lua_pop(L, 1);
return z;
}
lua_pcall在压入结果的之前,会将函数,和参数弹出,如果返回多个结果,第一个最先压入,
如果lua_pcall运行出错,那么会返回个非0值。
(完)
篇3:把Lua函数传递到C/C++中实例
这篇文章主要介绍了把Lua函数传递到C/C++中实例,本文先是分析了需求,然后给出解决方法,需要的朋友可以参考下
问题
在Lua中,因为函数也是第一类值,所以会出现将函数作为另一个函数的参数,或者函数作 为函数的返回值,这种机制在很多地方都能代码更灵活更简洁,例如:
代码如下:
table.sort(table [,comp])
这里的comp就要求传入一个函数,我们在调用时,大概会有如下形式:
代码如下:
table.sort(t, comp) -- 直接写函数名
table.sort(t, local_comp) -- 某个局部函数
table.sort(t, function (a, b) xxx end ) -- 临时构造一个匿名函数
其中最后一种方式最为灵活,任意时候在需要的时候构造一个匿名函数。这种在Lua自身的 环境中使用,自然没有问题。但是,当我们在C/C++中注册一些函数到Lua环境中,而这些 函数也需要使用函数参数的时候,问题就出来了。
Lua本身是不支持将Lua函数作为函数参数传入C/C++的,不管这个想要传入的函数是全局的 、局部的、或者匿名的(匿名的本质上也算局部的)。一般情况下,我们唯一的交互方式, 不是传入一个函数,而是一个全局函数名。C/C++保存这个函数名,在需要回调Lua的时候, 就在Lua全局表中找到这个函数(根据函数名),然后再调用之。情况大致如下:
代码如下:
function lua_func xxx end
cfunc(lua_func) -- wrong
cfunc(“lua_func”) -- right
我们这回的脚本模块,策划会大量使用需要回调函数的C/C++函数。显然,创建大量的全局 函数,先是从写代码的角度看,就是很伤神的。
解决
我们最终需要的方式,大概如下:
代码如下:
cfunc(lua_func) -- ok
cfunc(function () xxx end) -- ok
local xxx = function () xxx end
cfunc(xxx) -- ok
要解决这个问题,我的思路是直接在Lua层做一些包装。因为C/C++那边仅支持传入一个全局 函数名(当然不一定得全局的,根据实际情况,可能在其他自己构造的表里也行),也就是 一个字符串,所以我的思路就是将Lua函数和一个唯一的字符串做映射。
代码如下:
function wrap (fn)
local id = generate_id()
local fn_s = “__callback_fn”..id
_G[fn_s] = fn
return fn_s
end
这个wrap函数,就是将一个函数在全局表里映射到一个字符串上,那么在使用时:
代码如下:
cfunc(wrap(function () xxx end))
cfunc(const char *fn_name, xxx); -- cfunc的原型
cfunc是C/C++方注册进Lua的函数,它的原型很中规中矩,即:只接收一个函数名,一个字 符串,如之前所说,C/C++要调用这个回调函数时,就根据这个字符串去查找对应的函数,
脚本方在调用时,如果想传入一个匿名函数了,就调用wrap函数包装一下即可。
一个改进
上面的方法有个很严重的问题,在多次调用wrap函数后,将导致全局表也随之膨胀。我们需 要想办法在C/C++完成回调后,来清除wrap建立的数据。这个工作当然可以放到C/C++来进行 ,例如每次发生回调后,就设置下全局表。但这明显是不对的,因为违背了接口的设计原则 ,这个额外的机制是在Lua里添加的,那么责任也最好由Lua来负。要解决这个问题,就可以 使用Lua的metamethods机制。这个机制可以在Lua内部发生特定事件时,让应用层得到通知。 这里,我们需要关注__call事件。
Lua中只要有__call metamethod的值,均可被当作函数调用。例如:
代码如下:
ab(1, 2)
这里这个函数调用形式,Lua就会去找ab是否有__call metamethod,如果有,则调用它。这 个事实暗示我们,一个table也可以被调用。一个改进的wrap函数如下:
代码如下:
local function create_callback_table (fn, name)
local t = {}
t.callback = fn
setmetatable (t, {__call = -- 关注__call
function (func, ...) -- 在t(xx)时,将调用到这个函数
func.callback (...) -- 真正的回调
del_callback (name) -- 回调完毕,清除wrap建立的数据
end })
return t
end
function wrap (fn)
local id = generate_func_id() -- 产生唯一的id
local fn_s = “_callback_fn”..id
_G[fn_s] = create_callback_table(fn, fn_s) -- _G[fn_s]对应的是一个表
return fn_s
end
在我们的C/C++程序中,依然如往常一样,先是从_G里取出函数名对应的对象。虽然这个对 象现在已经是一个table。然后lua_call。
上面的代码是否会在原有基础上增加不可接受的性能代价?虽然我没有做过实际测试,但是 从表明看来,排除meta. table在Lua里的代价,也就多了几次Lua函数调用。
最后,感叹一下,Lua里的table及metatable机制,实在非常强大。这种强大不是功能堆砌 出来的强大,而是简单东西组合出来的强大。其背后的设计思想,着实让人佩服。
4.26. Update
之前的文中说“Lua本身是不支持将Lua函数作为函数参数传入C/C++的“,这句话严格来说不 正确(由某网友评论)。假设函数cfun由c/c++注册,我们是可以编写如下代码的:
代码如下:
cfunc(print) -- 传入Lua函数
但是问题在于,我们无法取出这个函数并保存在c/c++方。Lua提供了一些接口用于取cfunc 的参数,例如luaL_checknumber(封装lua_tonumber)。但没有类似luaL_checkfunction的 接口。Lua中的table有同样的问题。究其原因,主要是Lua中的函数没有直接的c/c++数据结 构对应。
篇4:c语言:实现一个函数,判断一个数是不是素数。
实现一个函数,判断一个数是不是素数,
程序:
#include 结果一: 请输入一个大于1的正整数:8 8不是素数 请按任意键继续. . . 结果二: 请输入一个大于1的正整数:17 17是素数 请按任意键继续. . . 实现一个函数判断year是不是润年, 程序: #include 结果一: 请输入年份: 是闰年 请按任意键继续. . . 结果二: 请输入年份:1995 1995年非闰年 请按任意键继续. . . 关于sizeof的使用,注意其不是函数,是一个操作符关键字 程序一: #include 结果: fun::4 40 2 0 10 请按任意键继续. . . 程序二: 定义一个数组arr,输出arr和&arr的区别#include 结果: 4 4 40 4 00F5F7C8 00F5F7C8 p+1=00F5F7CC q+1=00F5F7F0 请按任意键继续. . . 文档为doc格式篇5:c语言:实现一个函数判断year是不是润年。
篇6:c语言:sizeof的使用,其不是函数,是一个操作符关键