笔记:条款9: 绝不在构造和析构过程中调用virtual函数

本文探讨了C++中构造函数调用虚函数时的行为差异,并提供了代码示例来说明如何避免潜在的问题。了解基类与派生类在构造过程中的对象状态,有助于正确设计类层次结构。

这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。     

 我们原本认为构造子类对象时,如果在父类的构造函数中调用虚函数就会调用子类的虚函数,然而编译器会调用父类的虚函数,如果父类的虚函数是纯虚函数,编译器就会找不到父类虚函数的实现代码。

       编译器对这种在父类中调用虚函数的做法的一个解决方案是:继承类对象的基类对象构造期间对象的类型是基类而不是继承类。

合理的解释: 在基类构造函数执行时,继承类的成员变量尚未初始化,如果使用这些未初始化的成员将导致不明确行为。 对析构函数同理。

这是与java c#不相同的一个地方。

class A {
public:
	A() {
		init();
	}
	virtual void log() const {
		cout << "lkqA" << endl;
		cout << typeid(this).name() << endl;
	};
	void init() {
		log();
	}
	~A() {
		log();
	}
};

class B : public A {
	void log() const {
		cout << "lkq" << endl;
	}
};
int main(){
	B b;

}

解决方案;

在基类中将虚函数该为非虚,并在继承类的构造函数初始值列表传递信息给基类的构造函数,然后那个构造函数就可以安全地调用非虚函数。

class A {
public:
	A(string p) {
		init(p);
	}
	 void log(string p) const {
		cout << "lkqA" << endl;
		cout << typeid(this).name() << endl;
		cout << p << endl;
	};
	void init(string p ) {
		log(p);
	}
	~A() {
	}
};

class B : public A {
public:
	B(string p ):A(p){}
};
int main(){
	string p = "5201314";
	B b(p);
}

请记住

 在构造和析构期间不要调用虚函数,因为这类调用从不下降至继承类。

基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分,便于复现扩展应用。; 适合人群:具备电力系统基础知识Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结或加入更多不确定性因素进行深化研究。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值