欢迎来到千学网!
您现在的位置:首页 > 实用文 > 其他范文

一个C++继承、虚函数和多态性的实例代码

时间:2022-10-29 09:32:00 其他范文 收藏本文 下载本文

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

一个C++继承、虚函数和多态性的实例代码

篇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 #include int prime(int num) //prime表示素数{int i = 0;int k = 0;k = sqrt(num);for (i = 2; i <= k; i++){if (num%i == 0){ return 0;}}return 1;}int main(){int num;int ret;printf(“请输入一个大于1的正整数:”);scanf(“%d”, &num);ret = prime(num);if (ret == 1){printf(“%d是素数\n”, num);}else{printf(“%d不是素数\n”, num);}return 0;}

结果一:

请输入一个大于1的正整数:8

8不是素数

请按任意键继续. . .

结果二:

请输入一个大于1的正整数:17

17是素数

请按任意键继续. . .

篇5:c语言:实现一个函数判断year是不是润年。

实现一个函数判断year是不是润年,

程序:

#includeint leap_year(int year)//leap year 闰年{if ((year % 4 == 0 && year / 100 != 0) || (year % 400 == 0)){return 1;}else{return 0;}}int main{int year;int ret = 0;printf(“请输入年份:”);scanf(“%d”, &year);ret=leap_year(year);if (ret==1){printf(“%d年是闰年\n”, year);}else{printf(“%d年非闰年\n”, year);}return 0;}

结果一:

请输入年份:

是闰年

请按任意键继续. . .

结果二:

请输入年份:1995

1995年非闰年

请按任意键继续. . .

篇6:c语言:sizeof的使用,其不是函数,是一个操作符关键

关于sizeof的使用,注意其不是函数,是一个操作符关键字

程序一:

#include void fun(int arr[10]){printf(“fun::%d\n”, sizeof(arr));//}int main(){int i = 10;short a = 0;int arr[10];fun(arr);printf(“%d\n”, sizeof(arr));//40 printf(“%d\n”, sizeof(a++));//2printf(“%d\n”, a);//0printf(“%d\n”, i);//10system(“pause”);return 0;}

结果:

fun::4

40

2

0

10

请按任意键继续. . .

程序二:

定义一个数组arr,输出arr和&arr的区别#include int main(){int n = 10;int arr[10] = {0};int *p = NULL;int (*q)[10] = NULL;printf(“%d\n”, sizeof(n));//4printf(“%d\n”, sizeof(int));//4printf(“%d\n”, sizeof(arr));//40 printf(“%d\n”, sizeof(&arr));//4printf(“%p\n”, arr);//00D4FACC &arr[0],它表示数组首元素的地址printf(“%p\n”, &arr);//00D4FACC,它表示数组的地址,这两个表示意义不同p = arr;q = &arr;printf(“p+1=%p\n”,p+1);//p+1=007DF958printf(“q+1=%p\n”,q+1);//q+1=007DF97Creturn 0;}

结果:

4

4

40

4

00F5F7C8

00F5F7C8

p+1=00F5F7CC

q+1=00F5F7F0

请按任意键继续. . .

C++函数指针详解

Python回调函数用法实例详解

Excel函数应用实例:折旧值计算EXCEL 函数

Visual C++漏洞利用的一个Tips

继承和创新传统文化高考作文

SEO实例:关键词和网站流量

十、函数的定义和调用

继承传统文化作文开头和结尾怎样写

哲学理论的发展和批判继承的论文

Vista系统的蓝屏代码意思和解决方法

《一个C++继承、虚函数和多态性的实例代码(精选6篇).doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式

点击下载本文文档