`
standalone
  • 浏览: 614299 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

C++ - Calling virtual function from constructor

    博客分类:
  • c++
阅读更多
<!-- X-Subject-Header-End--> <!-- X-Head-of-Message-->
  • From : Rob Newberry <robnewberry at grouplogic dot com>
  • To : Eddy Ilg <eddy at fericom dot net>
  • Cc : gcc-help at gcc dot gnu dot org
  • Date : Thu, 22 Nov 2001 12:58:25 -0500 (EST)
  • Subject : Re: C++ - Calling virtual function from constructor
<!-- X-Head-of-Message-End--><!-- X-Head-Body-Sep-Begin-->
<!-- X-Head-Body-Sep-End--><!-- X-Body-of-Message-->
The reason you don't call virtual methods inside a constructor is because
you don't know what kind of object you are -- while you're in the process
of being constructed, you're still in a _somewhat_ indeterminate state.
Only after you are constructed are you a real object.

Here's an example:

	class	a
	{
		public:
			a();

			virtual void v_meth();
	};

	class	b : public a
	{
		public:
			b();

			virtual void v_meth();
	};


	a::a()
	{
		// this will _always_ call a::v_meth, because
		// at this point, that's what we are -- even
		// if we're in the process of constructing a 
		// subclass of class a
		v_meth();
	}

	void a::v_meth()
	{
		printf("a::v_meth\n");
	}

	b::b()
	{
		// likewise, this will always call b::v_meth,
		// because at this point, that's what we are
		v_meth();
	}

	void b::v_meth()
	{
		printf("b::v_meth\n");
	}

	main()
	{
		printf("constructing an a:\n");
		a	an_a;

		printf("constructing a b:\n");
		b	a_b;
	}
	
The output of this, with gcc, is:

	constructing an a:
	a::v_meth
	constructing a b:
	a::v_meth
	b::v_meth

As you can see, when you are constructing the 'b' object a_b, the
constructor for 'a' and 'b' get called in succession.  But the constructor
for 'a' calls 'v_meth', it ONLY calls the 'a' method, because at that
point, that's all the object it is.  This might not be the behavior you
want to have, since you're constructing a 'b' object.  That's why the
compiler complains about you calling a virtual method in a constructor.

Rob

---------------------------------------------------------------------
Rob Newberry
Director of Fajita Technology
Group Logic, Inc.


分享到:
评论

相关推荐

    Glaive-Function-Calling-V2函数调用数据集

    Glaive-Function-Calling-V2函数调用数据集

    Python库 | joint-calling-0.1.88.tar.gz

    标题中的"Python库 | joint-calling-0.1.88.tar.gz"表明这是一个与Python相关的库,且版本号为0.1.88,它被打包成一个tar.gz文件。这种格式通常用于在Unix/Linux环境中分发软件,因为它可以进行文件压缩并合并多个...

    PyPI 官网下载 | joint-calling-0.1.51.tar.gz

    标题中的"PyPI 官网下载 | joint-calling-0.1.51.tar.gz"表明这是一个在Python Package Index(PyPI)上发布的软件包,名为`joint-calling`,版本为0.1.51,其打包形式是tar.gz。PyPI是Python开发者发布自己软件包的...

    acs-voice-calling-quickstart-源码.rar

    【标题解析】:“acs-voice-calling-quickstart-源码.rar”这个标题表明这是一个关于“ACS语音通话快速启动”的源代码压缩包。ACS(Azure Communication Services)是微软提供的一个通信平台服务,允许开发者轻松...

    app-app-calling-android-master源码

    【app-app-calling-android-master源码】是一个针对Android平台的应用程序源码库,它提供了实现应用程序间通信(App-to-App Calling)的功能。这个源码项目对于开发者来说是一份宝贵的资源,可以帮助他们深入理解...

    app-app-calling-android, 使用本教程构建应用Android调用应用程序的应用程序.zip

    app-app-calling-android, 使用本教程构建应用Android调用应用程序的应用程序 #Build 一个简单的Android VoIP呼叫应用程序,带有 Sinch本教程将指导你构建一个简单的Android VoIP呼叫应用程序。 完成后,它将显示...

    method-calling.rar_in

    这个名为"method-calling.rar_in"的压缩包文件包含了一个关于Java方法调用的30个示例,旨在帮助学习者深入理解和掌握这一关键概念。以下是关于Java方法调用的一些详细知识点: 1. **方法定义**:在Java中,方法是一...

    DEN0028E-SMC-Calling-Convention-1.4eac0

    ARM DEN 0028E - SMC Calling Convention ARM DEN 0028E 是 Arm Limited 公司发布的一份关于 SMC 调用约定的文档,本文主要介绍了 SMC 和 HVC 调用约定的详细信息,包括 Secure Monitor Calls、Hypervisor Calls、...

    干货代码MATLAB控制CST进行建模仿真

    标题中的“干货代码MATLAB控制CST进行建模仿真”表明了这个压缩包内容的核心,即使用MATLAB编程控制CST(Computer Simulation Technology)软件进行电磁仿真。MATLAB是一款强大的数学计算软件,广泛用于数值分析、...

    Python库 | joint-calling-0.1.18.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:joint-calling-0.1.18.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    JAVA-NATIVE-INTERFACE-CALLING-CPP-LIBRARY.zip_5 to 1

    1.WRITE JAVA CODE 2.COMPILE THE JAVA CODE 3.CREATE C/C++ HEADER 4.WRITE THE C/C++ CODE 5.RUN THE JAVA CODE (IF USING VISUAL STUDIO 2010 DONT HAVE TO CREATE SHARED LIB FILE, IT WILL DO IT FOR U)

    Calling C from IDL(2002)

    《Calling C from IDL》是2002年发布的一份文档,主要探讨了如何在IDL(Interactive Data Language)环境中调用C和C++代码。IDL是一种强大的数据处理和可视化语言,广泛应用于科学计算和数据分析领域。而C和C++是...

    springboot-api-calling-from-api

    在Spring Boot框架中,API调用通常涉及到服务之间的通信,这在微服务架构中尤为重要。本文将深入探讨如何在Spring Boot应用中实现API调用,包括客户端库的使用、RESTful API的设计原则以及错误处理策略。...

    应用Dephi 开发佳能照相机API

    Calling this function releases all resources allocated by the libraries. This function delete all the reference or list objects that user has forgotten to delete. Parameters: In: None Out: ...

    An introduction to TMO and Sprint Wi-Fi calling-v1.0-demo

    Wi-Fi通话技术是一种让移动设备在Wi-Fi网络覆盖范围内进行语音通话、视频通话以及发送短信的服务。本介绍主要聚焦于T-Mobile(TMO)和Sprint两家运营商的Wi-Fi通话实现,涵盖了用户体验、终端实现、IMS网络支持、SIP...

    communication-services-web-calling-tutorial:Azure Communication Services的Web调用功能的入门样本

    cd communication-services-web-calling-tutorial / Project 通过从Azure门户配置Azure通信服务资源来获取连接字符串。 将连接字符串用作config.json文件中键connectionString值。 npm安装 npm运行构建 npm运行...

    motw-calling:MOTW 的呼叫能力

    &lt;Project&gt;&gt; cd motw-calling dev_appserver.py . (如果您安装了适用于 Python 的 Google Cloud 工具) python -m SimpleHTTPServer 8080 (如果你没有安装 GCE for Python) 打开您最喜欢的浏览器并按照以下模式...

    SARS-CoV2-variant-calling-example:一个具有教育意义的示例,该示例使用SARS-CoV2基因组,使用带有短读Illumina数据的调用变体

    git clone https://github.com/davidecarlson/SARS-CoV2-variant-calling-example.git 第三步 使用提供的环境文件,使用此分析中所需的软件创建新的conda环境: conda env create -f environment.yaml 步骤4 从...

    语音合成代码matlab-Calling-COTOHA-API-from-MATLAB:此存储库提供了一些从MATLAB调用COTOHAAPI

    语音合成代码matlab 什么是COTOHA API? NTT集团开发的COTOHA API提供日语专用的自然语言处理。 看 COTOHA API能够执行各种任务(有关详细信息,请参见),并且一些高级功能包括 ...我相信这些功能可以完全发挥作用,...

    bonobo-calling-express:no黑猩猩电话快递

    "bonobo-calling-express:no黑猩猩电话快递" 是一个基于JavaScript的项目,看起来它正处于开发阶段(Work In Progress,简称WIP)。这个项目的标题可能是以一种幽默或创意的方式命名,暗示着该项目可能涉及某种形式...

Global site tag (gtag.js) - Google Analytics