Effective C++ Item33:避免遮掩继承而来的名称

本文探讨了C++中子类函数如何遮掩基类函数的问题,包括mf1和mf3函数的作用域问题,并提供了两种解决方案:using声明式和转交函数方法。

这个主题和继承关系不大,主要是对作用域的理解和把握

还是通过代码来看:

class Base {
private:
	int x;
public:
	virtual void mf1() = 0;
	virtual void mf1(int);
	virtual void mf2();
	void mf3();
	void mf3(double);
};
class Derived : public Base {
public:
	virtual void mf1();
	void mf3();
	void mf4();
};
int main()
{
	Derived d;
	int x = 1;
	d.mf1();//没问题,调用Derived::mf1()
	d.mf1(x);//错误,Derived::mf1()遮掩了Base::mf1函数
	d.mf2();//没问题,调用Derived::mf2()
	d.mf3();//没问题,调用Derived::mf3()
	d.mf3(x);//错误,Derived::mf1()遮掩了Base::mf3函数
	return 0;
}

上述代码中,子类中的mf1和mf3遮掩了基类中的所有名为mf1和mf3的函数,于是,Base::mf1和Base::mf3就不再被Derived继承。

这样做的好处在于避免在程序库或应用框架内建立新的子类时,附带地从疏远的基类继承重载函数。像例子中,避免了基类中mf1和mf3函数的重载函数的继承。

而pubic继承,子类与基类是“is-a”的关系,意味着子类拥有基类的所有东西,如果使用public继承,又不继承基类中的重载函数,那就违反了public继承的意义

为了实现public继承中子类与基类的“is-a”的关系,有两种方案:

1. 方案一:使用using声明式实现:

class Base {
private:
	int x;
public:
	virtual void mf1() = 0;
	virtual void mf1(int);
	virtual void mf2();
	void mf3();
	void mf3(double);
};
class Derived : public Base {
public:
	using Base::mf1; //使用using声明式使Base::mf1在子类中可见
	using Base::mf3; //使用using声明式使Base::mf3在子类中可见
	virtual void mf1();
	void mf3();
	void mf4();
};
int main()
{
	Derived d;
	int x = 1;
	d.mf1();//没问题,调用Derived::mf1()
	d.mf1(x);//没问题,调用Base::mf1函数
	d.mf2();//没问题,调用Derived::mf2()
	d.mf3();//没问题,调用Derived::mf3()
	d.mf3(x);//没问题,调用Base::mf3函数
	return 0;
}

方案一解决了由于在子类中重新定义函数,遮掩了基类重载函数的问题。using声明式使得基类中的函数在子类作用域中都可见。但是,我们可能并不总是希望继承基类所有的函数都在子类可见,这样的需求该如何满足?

2. 方案二使用private继承,并在继承中使用了转交函数(forwarding function)来解决上述的问题:

class Base {
private:
	int x;
public:
	virtual void mf1() = 0;
	virtual void mf1(int);
};
class Derived : private Base {
public:
	virtual void mf1() {
		Base::mf1();//转交函数,仅继承基类无参的mf1函数
	}
};
int main()
{
	Derived d;
	int x = 1;
	d.mf1();//没问题,调用Derived::mf1()
	d.mf1(x);//错误,Base::mf1函数被遮掩
	return 0;
}

在子类的mf1函数,将mf1函数需要执行的任务交给了Base类的mf1函数来执行。

而在其中仅调用了Base的mf1函数的无参函数,达到了遮掩mf1有参函数的目标。

3. 总结:

  1. 名称遮掩的问题本质是对作用域的理解,能够很好理解作用域,名称遮掩的问题也不是难事。
  2. 解决名称遮掩问题的方式有using声明式和转交函数方法,可根据实际应用场景选择合适的方案。
  3. 有关转交函数的问题可查阅《Exceptional C++》的条款46,有对转交函数的详细介绍

内容概要:本文围绕“考虑电能交互的冷热电区域多微网系统双层多场景协同优化配置”的Matlab代码实现展开,提出一种结合电能交互机制的双层优化模型,用于解决冷、热、电多能耦合背景下多微网系统的协同规划与运行问题。研究采用多场景分析方法应对可再生能源出力与负荷需求的不确定性,通过上层规划设备容量配置与下层优化多时段运行策略的联动,提升系统在复杂环境下的经济性、鲁棒性与能源利用效率。所提供的Matlab代码集成了建模、求解(如YALMIP+CPLEX)与结果可视化全流程,涵盖场景生成与削减、双层优化结构设计及多能流协同调度等关键技术环节,为综合能源系统优化提供了完整的算法实现与技术参考。; 适合人群:具备电力系统、综合能源系统或优化建模背景,熟悉Matlab编程与数学规划方法,正在从事相关领域科研或工程设计工作的研究生、高校研究人员及能源行业技术人员。; 使用场景及目标:①开展冷热电联供(CCHP)多微网系统的容量规划与运行优化研究;②支撑含分布式能源、储能及多能转换设备的综合能源系统多目标、多场景优化建模;③学习与复现双层优化、分布鲁棒优化及场景分析等先进优化方法在能源系统中的实际应用。; 阅读建议:建议结合配套文献与代码同步研读,重点理解双层模型的构建逻辑、变量耦合关系与求解技巧,关注场景生成方法与YALMIP调用细节,通过调整参数、修改目标函数等方式进行仿真实验,以深化对系统优化机理的掌握。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值