递归火山软件开发平台

标题: 如何使用虚拟方法可覆盖重写父类虚函数 [打印本页]

作者: 沉默流星    时间: 2025-5-18 16:44
标题: 如何使用虚拟方法可覆盖重写父类虚函数
本帖最后由 沉默流星 于 2025-5-18 17:29 编辑

问题如下:
  1. #include <iostream>

  2. // 基类 ASD
  3. class ASD {
  4. public:
  5.     // 虚函数 add
  6.     virtual int add(int a, int b) {
  7.         return a + b;
  8.     }

  9.     // 虚析构函数(确保删除派生类对象时不会出现问题)
  10.     virtual ~ASD() {}
  11. };

  12. // 派生类 BB
  13. class BB : public ASD {
  14. public:
  15.     // 重写虚函数 add
  16.     int add(int a, int b) override {
  17.         return a + b + 10;  // 示例:在基类的基础上加10
  18.     }
  19. };

  20. int main() {
  21.     // 使用基类指针指向派生类对象
  22.     ASD* ptr = new BB();

  23.     // 调用重写的 add 函数
  24.     std::cout << "Result: " << ptr->add(5, 3) << std::endl;  // 输出应该是 18 (5+3+10)

  25.     // 释放内存
  26.     delete ptr;

  27.     return 0;
  28. }
复制代码
如何使用@虚拟方法 可覆盖 来重写父类虚函数,然后又如何调用.
说的是封装,使用别名无法使用@虚拟方法。

作者: 创世魂    时间: 2025-5-18 17:03
就这样啊,和你给的案例差不多,设置虚拟方法标记就行了。


  1. <火山程序 类型 = "通常" 版本 = 1 />

  2. 类 类1
  3. {
  4.     方法 方法1 <公开 类型 = 整数 @虚拟方法 = 可覆盖>
  5.     参数 a <类型 = 整数>
  6.     参数 b <类型 = 整数>
  7.     {
  8.         返回(a+b)
  9.     }
  10. }

  11. 类 类2 <基础类 = 类1>
  12. {
  13.     方法 方法1 <公开 类型 = 整数 @虚拟方法 = 可覆盖>
  14.     参数 a <类型 = 整数>
  15.     参数 b <类型 = 整数>
  16.     {
  17.         返回 (父对象.方法1 (a, b) + 10)  // 调用基础类中的被覆盖虚拟方法

  18.     }
  19. }

复制代码

作者: 创世魂    时间: 2025-5-18 17:05
调用就更简单了,直接常规方式调用就行了。。

  1. <火山程序 类型 = "通常" 版本 = 1 />

  2. 方法 我的主窗口_创建完毕 <接收事件 类型 = 整数>
  3. 参数 来源对象 <类型 = 我的主窗口>
  4. 参数 标记值 <类型 = 整数>
  5. {
  6.     变量 类 <类型 = 类2>
  7.     调试输出 (类.方法1 (1, 2))
  8.     返回 (0)
  9. }
复制代码

作者: 沉默流星    时间: 2025-5-18 17:13
创世魂 发表于 2025-5-18 17:05
调用就更简单了,直接常规方式调用就行了。。

我说的不是仿写,而是封装
作者: Xelloss0618    时间: 2025-5-18 17:39
本帖最后由 Xelloss0618 于 2025-5-18 17:41 编辑

设置输出名和 @视窗.后缀文本 "override"不过你说别名的话,这本来就无法封装的,别名是直接引用C++类,你就算要覆盖虚拟方法,也是C++代码那边把子类写好了再封装给火山。

作者: 沉默流星    时间: 2025-5-18 17:43
Xelloss0618 发表于 2025-5-18 17:39
设置输出名和 @视窗.后缀文本 "override"不过你说别名的话,这本来就无法封装的,别名是直接引用C++类,你 ...

不使用别名,如何封装呢
作者: Xelloss0618    时间: 2025-5-18 17:47
沉默流星 发表于 2025-5-18 17:43
不使用别名,如何封装呢

上面说了,设置输出名
作者: 沉默流星    时间: 2025-5-18 17:55
Xelloss0618 发表于 2025-5-18 17:47
上面说了,设置输出名

好像不行啊他需要返回值

(, 下载次数: 36)

(, 下载次数: 38)

作者: Xelloss0618    时间: 2025-5-18 18:24
沉默流星 发表于 2025-5-18 17:55
好像不行啊他需要返回值

你没写return啊……还有禁止流程检查。
而且你这个完全不需要写输出名和后缀文本。
只有继承了父类,才需要写输出名,你可以参考 扩展对象类
作者: 沉默流星    时间: 2025-5-18 18:31
Xelloss0618 发表于 2025-5-18 18:24
你没写return啊……还有禁止流程检查。
而且你这个完全不需要写输出名和后缀文本。
只有继承了父类,才需 ...

扩展对象类 不对啊.他继承自对象类。但对象类中没有展示内容函数。他怎么能加override

(, 下载次数: 43)



我加为啥不行呢.
(, 下载次数: 46)

(, 下载次数: 44)

作者: Xelloss0618    时间: 2025-5-18 18:35
沉默流星 发表于 2025-5-18 18:31
扩展对象类 不对啊.他继承自对象类。但对象类中没有展示内容函数。他怎么能加override

你没看清楚,对象类是 CVolObject 的别名,CVolObject 里有 GetDumpString 的虚拟方法,所以能用输出名封装出来。
你的父类不是别名,自然不行。
作者: 沉默流星    时间: 2025-5-18 18:37
Xelloss0618 发表于 2025-5-18 18:35
你没看清楚,对象类是 CVolObject 的别名,CVolObject 里有 GetDumpString 的虚拟方法,所以能用输出名封 ...

这样啊,感谢X大解惑。
作者: hcwanz    时间: 2025-5-18 18:41
我记的@接口 这个属性就是为了别名封装虚函数搞的吧
作者: 沉默流星    时间: 2025-5-18 18:46
hcwanz 发表于 2025-5-18 18:41
我记的@接口 这个属性就是为了别名封装虚函数搞的吧

看文档是,但具体如何整,没看明白
作者: hcwanz    时间: 2025-5-18 18:51
沉默流星 发表于 2025-5-18 18:46
看文档是,但具体如何整,没看明白

https://bbs.voldp.com/forum.php? ... 0%E6%8E%A5%E5%8F%A3
我在这里面照着火山里写的例子说了一下
作者: 沉默流星    时间: 2025-5-18 19:03
hcwanz 发表于 2025-5-18 18:51
https://bbs.voldp.com/forum.php?mod=viewthread&tid=21779&highlight=%40%E6%8E%A5%E5%8F%A3
我在这里 ...

好的,我研究研究,感谢
作者: 创世魂    时间: 2025-5-18 22:28
沉默流星 发表于 2025-5-18 18:46
看文档是,但具体如何整,没看明白

接口自带例子有,可以看看自带例子接口是怎么用的,吴总给了封装案例的。




欢迎光临 递归火山软件开发平台 (https://bbs.voldp.com/) Powered by Discuz! X3.4