作业帮 > 综合 > 作业

为什么C++设虚函数,smalltalk语言没有?Ada的类属函数和C++虚函数的同异是什么?

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/09/18 08:19:53
为什么C++设虚函数,smalltalk语言没有?Ada的类属函数和C++虚函数的同异是什么?
Ada语言类属与C++的虚函数一点也不相同.
type T is tagged -- “标记的记录”,tagged record类似于C++的多态类
record
C :Character;
end record;
procedure Op1 (X :T); -- C++的virtual void op1();
procedure Op2 (X :T'Class; N :Integer);
-- 不是因为有N这个参数,而是因为有'Class属性,C++的普通函数:void op2(const int& n);
-- 只有(abstract) tagged record与interface可以有'Class属性——在作为子程序的首参数时
type Derived is new T with
record
Num :Integer;
end record;
procedure Op1 (X :Derived); -- 覆盖基类的原生操作
procedure Op2 (X :Derived; N :Integer); -- 错误,不能覆盖
declare
Object :Derived := (C => 'C',Num => 3);
begin
Object.Op1; -- 调用 procedure Op1 (X :Derived);
Object.Op2; -- 调用 procedure Op2 (X :T'Class; N :Integer);
end;
类似就像C++的模板,但是,不同点在于:C++的模板参数一定是编译时被知道的,但Ada的类属不是这样的.Ada的类属对不同的参数的实例都共享同一个实体;但是C++会为不同的模板参数实例不同的实例,这样体积就可能过大或者储存器无法接受.类属与多态毫不相干,但是在Ada95时,有人会用类属艰难地、丑陋地模拟一种“类多重继承”,Ada2005已解决了这个问题.