构造函数中调用虚函数能否实现多态

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

问:构造函数中调用虚函数能否实现多态?

#include <iostream>
using namespace std;

class Parent
{
public:
	Parent(int a = 0)
	{
		this->a = a;
		print();
	}
	virtual void print()
	{
		cout<<"Parent1"<<endl;
	}
	virtual void print2()
	{
		cout<<"Parent2"<<endl;
	}
	
protected:
private:
	int a;
	
};
class Child :public Parent
{
public:
	Child(int b = 0):Parent(2)
	{
		this->b = b;
		print();
	}
	void print()
	{
		cout<<"Child1"<<endl;
	}
	void print2()
	{
		cout<<"Child2"<<endl;
	}
protected:
private:
	int b;
};
void howToPrint(Parent *p)
{
	p->print();
}
int main()
{
	
	Child c;
	<pre name="code" class="cpp">        howToPrint(&c);
system("pause");return 0;}


对象中的VPTR指针什么时候被初始化?

1. 对象在创建的时,由编译器对VPTR指针进行初始化

2.只有当对象的构造完全结束后VPTR的指向才最终确定:

   父类对象的VPTR指向父类虚函数表

   子类对象的VPTR指向子类虚函数表


结论:子类对象构建时,在父类调用虚函数,不会产生多态。

C/C++—— 在构造函数调用虚函数实现多态吗(Vptr指针初始化的过程分析) 问题引入:比如:如果我们想在父类的构造函数调用虚函数,当定义子类对象的时候,父类的构造函数中的虚函数执行的是子类中的函数。 阅读详情

相关推荐

构造函数调用虚函数

面试常见题。 事实上在语法上是没有问题的,编译可以通过。问题在于构造函数调用虚函数无法实现多态。 看下面的代码: class A { public: A() { show(); }//行4 virtual void show() { cout << "A"; } void anotherShow(){show();}//行6 }; class B:public A { public

huang1433的博客 3654

父类和子类同名函数以及虚函数多态问题

1、子类和父类返回值参数相同,函数名相同,有virtual关键字,则由对象的类型决定调用哪个函数。 2、子类和父类只要函数名相同,没有virtual关键字,则子类的对象没有办法调用到父类的同名函数,父类的同名函数被隐藏了,也可以强制调用父类的同名函数class::funtion_name。 3、子类和父类参数同,函数名相同,有virtual关键字,则存在多态性,子类的对象没有办法调用到父类的同名函数,父类的同名函数被隐藏了,也可以强制调用父类的同名函数class::funtion_name。 4、子类

梅杏柿的博客 6401

C++(多态虚函数构造函数,static)

C++重要知识点(虚函数,拷贝构造函数,static)

qq_41421755的博客 747

C++经验(四)-- 基类构造函数和析构函数中调用virtual虚函数

class Base { public: Base(); virtual void oneFunction() = 0; ... }; Base::Base() { ... oneFunction(); } class Derived : public Base { public: Derived(){}; virtual void oneFunction() { std::cout << "Derived oneFunction

slowlytalk 1943

构造函数调用虚函数

在基类的构造函数调用虚函数,语法是没有问题的,但执行情况可能太一样。 下面举例说明: class Base { public: Base() { Test(); } virtual void Test() { printf("Base Test\n"); } }; class Car : public Ba...

Think88666的博客 1953

构造函数支持多态

今天在写项目的时候,需要使用到多态的效果,因此就设计了三个类,一个基类,一个派生类,外加一个派生类中需要使用到的界面类。 大体结构如下: ///< 基类 > // 头文件 #pragma once #include <QtWidgets/QMainWindow> #include "ui_wgttest.h" class QTabWidget; class WgtTest : public QMainWindow { Q_OBJECT public: Wgt

“时光清浅,不觉多年”的博客 458

构造函数中使用虚函数可以实现多态吗?

构造函数调用虚函数为什么实现多态? 为什么要使用虚析构?内存泄漏

qq_45570844的博客 406

构造函数调用虚函数,能实现多态吗?

内容来源: 传智播客 c++面试中常常会问到一个问题: 通过子类对象,在父类构造函数调用虚函数,能实现多态吗? #iinclude<iostream> using namespace std; class A { public: int a; A(int a) { this->a = a; print(); } virtual void print() ...

qq_20880939的博客 509

多态相关的面试题

1.如何理解多态多态实现效果:同样的调用语句有多种的表现形态; 多态实现的三个条件:有继承、有virtual重写、有父类指针(引用)指向子类对象; 多态的C++实现:virtual关键字,告诉编译器这个函数要支持多态是根据指针类型判断如何调用; 而是根据指针所指向的实际对象类型来判断如何调用 多态的理论基础:动态联编PK静态联编,根据实际的对象类型来判断重写函数的调用多态

patkritLee的博客 998

第七天之多态原理探究

理论知识: 1)当类中声明虚函数时,编译器会在类中生成一个虚函数表 2)虚函数表是一个存储类成员函数指针的数据结构 3)虚函数表是由编译器自动生成与维护的 4)virtual成员函数会被编译器放入虚函数表中 5)当存在虚函数时,每个对象中都有一个指向虚函数表的指针(C++编译器给父类对象、子类对象提前布局vptr指针;当进行 howToPrint(Parent *base)函数是,C++编译器...

qq_42230338的博客 456

关于多态实现的一些问题

多态实现的原理 首先多态实现必须依赖于两个条件: 1)子类重写父类的虚函数 2)必须通过基类的指针或者引用来调用虚函数 实现多态的机制是通过虚函数表(函数指针的指针数组)来实现的,虚表的最后是一个nullptr 虚表的构建过程: 1)子类拷贝父类的虚表 2)进行重写过的函数指针进行相同偏移量位置的替换 3)将新增的虚函数添加在虚表结尾 key:多继承未重写的虚函数放在第一个继承基...

ladykiller21的博客 220

c++基础 | 多态实现原理

文章目录 理论知识 多态原理实现 如何证明vptr指针存在 构造函数中能调用虚函数实现多态吗? 理论知识 当类中声明虚函数时,编译器会在类中生成一个虚函数表。虚函数表用来存储虚函数指针的数据结构,由编译器自动生成和维护。 当存在虚函数时,每个对象都有一个指向虚函数表的指针(vptr)。编译器需要区分子类对象或者父类对象,只需要根据vptr指针来确定调用的函数。 多态原理实现 编译器确定是否为虚函数: fun虚函数,编译器可直接确定被调用的成员函数(静态联编,根据Parent的类型确定) fun

W776655的博客 243

C++中多态相关的面试题

1.谈谈你对多态的理解,多态的现象? 2.谈谈C++编译器是如何实现多态的? 3.重写、重载的区别?多态在其中的现象,多态属于两个中的哪个? 4.是否可以将类的每个成员函数声明为虚函数,为什么? 答:需要,因为普通的成员函数是在编译期间就确定了该函数的调用,而通过虚函数表指针VPTR调用重写函数,是在程序运行期间才进行的,因此需要通过寻址操作才能确定真正该调用虚函数,所以虚函数的效率实...

qq_38410911的博客 592

<c++>虚函数多态 | 虚函数与纯虚函数 | 多态实现原理 | 虚析构函数

在上一篇文章中,我们介绍了c++中类与对象的继承,继承可以根据一个或多个类来定义一个新的类,减少代码量,使得开发和维护一个应用程序变得更加的容易。本文将介绍c++继承的重要应用 —— 多态

Ceylan__的博客 1652

在父类的构造函数调用虚函数可以实现多态么?

在父类的构造函数调用虚函数能够实现多态的,这个问题涉及到vptr指针的初始化问题。 比如在构造子类对象c时,执行到父类的构造函数时,这个c.vptr指向的是父类的虚函数表,这时调用虚函数,执行的是父类的虚函数多态。当执行完父类的构造函数,执行到子类构造函数时,这个c.vptr指针这时才指向本身自己的虚函数表。注意,每一个对象都有一个vptr指针和一个虚函数表,这个是在编译时就...

一路向北 1533

【C++】为什么构造函数能是虚函数(没有意义,实现多态);构造函数内能调用虚函数吗(可以,实现多态

文章目录一、虚析构函数二、构造函数为什么能是虚函数?三、虚构造函数没有意义:1、首先是C++ Primer Plus 的解释:2、C++之父的解释参考 一、虚析构函数 虚析构函数是为了析构对应的对象,而是指针指向谁就析构谁; 主要是为了多态的使用; 所以去虚函数表中找这个对象的析构函数来析构;进而析构其父类; 二、构造函数为什么能是虚函数? 虚构造函数能,而是没有意义。 首先,构造函数被继承,构建派生类的时候,也会构建基类,虚构造没有意义; C++ 作者的解释为,虚函数为了多态设计,

多丰富下自己呀 2279

虚函数实现多态的原理

1、C++中如何实现多态 基类中先声明一个虚函数 至少有一个继承该基类的子类 2、虚函数实现多态的原理 当一个类中出现虚函数或着子类继承了虚函数时,就会在该类中产生一个虚函数表(virtual table),虚函数表实际上是一个函数指针数组(在有的编译器作用下是链表),里面的每一个元素对应指向该类中的某一个虚函数的指针。被该类声明的对象会包含一个虚函数表指针(virtual table pointer),指向该类的虚函数表的地址。 虚函数调用过程: 当一个对象要调用虚函数时,先将对象内存中的vpt

Cynan_Gattackon 4277

C++基础| 多态虚函数 大汇总:C++怎么实现多态虚函数和纯虚函数的区别 、虚函数是怎么实现的 、虚函数表是什么 、什么是构造函数和析构函数?构造函数、析构函数可以是虚函数

C++基础| 多态虚函数 大汇总:C++怎么实现多态虚函数和纯虚函数的区别 、虚函数是怎么实现的 、虚函数表是什么 、什么是构造函数和析构函数?构造函数、析构函数可以是虚函数

2402_84438596的博客 1070

在父类的构造函数调用虚函数为什么实现多态

欢迎点击「算法与编程之美」↑关注我们!本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。问题描述大家都知道在面向对象语言中,多态实际上就是接口的...

算法与编程之美 790
上一篇: C++多态原理探究
下一篇: 纯虚函数和抽象类
BUS375
博客等级 码龄14年 105粉丝 167原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值