首页 > 其他分享 >我可以从构造函数中调用虚函数吗?

我可以从构造函数中调用虚函数吗?

时间:2023-02-23 16:55:26浏览次数:36  
标签:调用 函数 派生类 constructor include 构造函数

是的,但要小心。 它可能不会做你期望的。 在构造函数中, 虚拟调用机制被禁用,因为从派生覆盖 课程还没有发生。 对象是从基础向上构建的, “派生前的基础”。

考虑到

#include<string>
	#include<iostream>
	using namespace std;

	class B {
	public:
		B(const string& ss) { cout << "B constructor\n"; f(ss); }
		virtual void f(const string&) { cout << "B::f\n";}
	};

	class D : public B {
	public:
		D(const string & ss) :B(ss) { cout << "D constructor\n";}
		void f(const string& ss) { cout << "D::f\n"; s = ss; }
	private:
		string s;
	};

	int main()
	{
		D d("Hello");
	}

程序编译并生成

B constructor
B::f
D constructor

注意 不是 D::f。 考虑如果规则不同会发生什么 D::f() 是 从 B::B() 调用:因为构造函数 D:: D() 尚未运行, D::f() 会尝试将其参数分配给未初始化的字符串 s。 结果很可能是立即崩溃。

破坏是“在基类之前的派生类”完成的,因此虚函数 与构造函数中的行为相同:仅使用局部定义 - 不使用 调用重写函数以避免触及(现已销毁) 对象的派生类部分。

有关详细信息,请参阅 D&E 13.2.4.2 或 TC++PL3 15.4.3。

有人建议此规则是一个实现工件。 这是 不是这样。 事实上,实施不安全规则会容易得多 从构造函数中调用虚函数与​​从其他函数中调用虚函数完全一样。 但是,这意味着不能编写任何虚函数来依赖 关于由基类建立的不变量。 那将是一团糟。

注意:可以结合这篇文章来看https://www.cnblogs.com/wozhuyinghao/p/17148698.html

标签:调用,函数,派生类,constructor,include,构造函数
From: https://www.cnblogs.com/wozhuyinghao/p/17148676.html

相关文章

  • python入门之函数返回值的应用
    """函数返回值应用"""#函数设计思想:#分而治之#干一件事#需求:定义两个数字相加的函数#defadd():#1.获取数据#number01=int(i......
  • shell中的函数
    函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程定义函数函数由两部分组成:函数名和函数体helpfunction语法一:f_name(){...函数体...}语法二......
  • Vue框架:9,Vue3的用法,setup函数,ref和reactive,计算属性和监听属性,生命周期,toRefs,script s
    目录前端开发之Vue框架一、Vue31、Vue3创建项目2、setup函数3、ref和reactive4、计算属性和监听属性5、生命周期6、toRefs7、scriptsetup的作用和lang8、Vue后台管理模板......
  • Feign调用时将请求头信息传递到调用下游方案
    一、需求分析现有接口存在对用户信息进行拦截鉴权需求,在使用Feign包调用下游接口时,需要将当前请求头一直传递下去。二、实现方案在参考了网上的各种资料之后,通......
  • 在线客服系统复制聊天链接,JS实现复制文本函数
    客服系统(gofly.v1kf.com)后台有这个功能,可以直接复制文本信息,JS实现的函数  functioncopyToClipboard(text){vardummy=document.createElement("input");//......
  • ABAP 委外采购收货调用过账bapi
    相关的表:ekko:采购凭证抬头表用于判断是否委外ekpo:采购凭证行项目表用于判断是否委外以及委外采购的数量resb:获取委外采购单中bom的相应预留mseg:获取已经委外原材......
  • PowerShell 调用接口插入模拟数据
       functioninsertUser($i=2){$str="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"#字符串#echo$str.ToCharArray()......
  • 06. 函数
    一、什么是函数  C程序是由函数组成的,我们写的代码都是由主函数main()开始执行的。函数是C程序的基本模块,是用于完成特定任务的程序代码单元。也就是说,main()函数......
  • Jmeter学习:常用内置函数
    常用函数一:  常用函数二:__counter功能介绍:生成一个计数器变量,每次使用的时候+1__counter(false,gseq)表示所有线程共用,所有线程及迭代共享计数。......
  • js浮点数精确计算函数(加,减,乘,除)
    js浮点数精确计算函数(加,减,乘,除)//浮点数加法运算functionFloatAdd(arg1,arg2){varr1,r2,m;try{r1=arg1.toString().split(".")[1].length}catch(e){r......