virtual 的问题

在看一个系统的源码时,发现有些类的纯虚函数中有缺省值,但不知道如何使用这些缺省值?在继承类中能使用吗?但下面的例子在编译的时候通不过:
#include <stdio.h>;
#include <iostream>;
#include <stdlib.h>;

using namespace std;

class A
{
public:
    virtual void func(int a, int b = 0) = 0;
};


class B: public A
{
public:
    void func(int a, int b)
    {
        cout << "a = " << a << "    b = " << b << endl;
    }
};

int main()
{
    B b;
    b.func(10);
}
编译时报错如下:The wrong number of arguments have been specified for "B::func(int, int)".


这里出错的原因是你没有搞清楚虚函数之动态绑定机制和缺省参数在继承中的意义.
1>;什么是动态类型与静态类型?
比如你这里A *pa = new B;这里的pa的静态类型就是A *而它的动态类型呢就是B,而B *pb=new B;它的动态与静态类型都是B *.但你这里用的是B b;b的型别是B,静态与动态类型都是B,虚函数是用来干什么的?是用来动态绑定的呀,而动态绑定是需要通过指针或引用实现的呀,你直接用类对象能实现动 态绑定吗?所以你这里根本不会根据基类A的成员函数来动态绑定来调用B的相应成员函数,所以缺省参数就没有.

2>;缺省参数是个静态绑定的而非动态.即如有:
A *pa = new B;
那么pa->;fun(..);此时pa的静态类型为A *,它有缺省参数值,所以如果你把
void B:: func(int a, int b) 改成void B::func(int a, int b=7) 后它用的默认参数值还是A中定义的.虽然实际上调用的是B的成员函数.但并没有用B的成员函数中参数的默认值.所以注意一点就是不要在继承中改变默认参数 值的定义.

居于以上两点你的程序可以改为如下:main部分:

int main()
{
    B b;
    A &rb=b;
  rb.func(10);
}
 
混合动力汽车(HEV)模型的Simscape模型(Matlab代码、Simulink仿真实现)内容概要:本文档介绍了一个混合动力汽车(HEV)的Simscape模型,该模型通过Matlab代码和Simulink仿真工具实现,旨在对混合动力汽车的动力系统进行建模与仿真分析。模型涵盖了发动机、电机、电池、传动系统等关键部件,能够模拟车辆在不同工况下的能量流动与控制策略,适用于动力系统设计、能耗优化及控制算法验证等研究方向。文档还提及该资源属于一个涵盖多个科研领域的MATLAB仿真资源包,涉及电力系统、机器学习、路径规划、信号处理等多个技术方向,配套提供网盘下载链接,便于用户获取完整资源。; 适合人群:具备Matlab/Simulink使用基础的高校研究生、科研人员及从事新能源汽车系统仿真的工程技术人员。; 使用场景及目标:①开展混合动力汽车能量管理策略的研究与仿真验证;②学习基于Simscape的物理系统建模方法;③作为教学案例用于车辆工程或自动化相关课程的实践环节;④与其他优化算法(如智能优化、强化学习)结合,实现控制策略的优化设计。; 阅读建议:建议使用者先熟悉Matlab/Simulink及Simscape基础操作,结合文档中的模型结构逐步理解各模块功能,可在此基础上修改参数或替换控制算法以满足具体研究需求,同时推荐访问提供的网盘链接获取完整代码与示例文件以便深入学习与调试。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值