首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如果我的基类只被我的子类使用,我是否应该在基类中有一个构造函数?

如果基类只被子类使用,是否在基类中有一个构造函数取决于基类的具体设计和用途。构造函数用于初始化对象的实例变量和执行其他必要的操作,通常在创建对象时被调用。

如果基类的构造函数包含了子类所需的初始化逻辑,或者有其他的操作需要在子类创建实例时执行,那么在基类中拥有一个构造函数是有意义的。

然而,如果基类没有这样的初始化逻辑或其他需要执行的操作,并且基类的构造函数不会被子类直接调用,那么在基类中定义一个构造函数可能是多余的。基类的构造函数应该被设计为提供给子类使用,而不是作为独立使用的方法。

在云计算领域,没有特定的产品或服务与这个问题直接相关。然而,如果使用腾讯云,可能可以使用云函数 SCF(Serverless Cloud Function)服务,该服务提供了一种无需管理服务器即可运行代码的方式,可以用于创建云函数,并为基类和子类提供所需的构造函数逻辑。详细信息请参阅腾讯云云函数 SCF的官方文档:https://cloud.tencent.com/product/scf

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

EasyC++79,虚函数注意事项

这里简单做一个总结: 在基类的方法声明中使用关键字virtual可以声明虚函数 加上了virtual关键字的函数在基类以及派生类和派生类再派生出来的类中都是虚的 在调用虚函数时,程序将会根据对象的类型执行对应的方法而非引用或指针的类型...构造函数 构造函数不能是虚函数,创建派生类对象时将调用派生类的构造函数,而非基类的构造函数,毕竟构造函数是根据类名调用的。...没有重新定义 如果派生类当中没有重新定义虚函数,那么将使用该函数的基类版本。如果派生类位于派生链中,如B继承了A,C继承了B这种情况,那么派生类将会使用最新的虚函数版本。...speak,而在子类Human当中也定义了一个需要传入一个string类型的虚函数speak。...在派生类当中重新定义函数,不是使用相同的函数特征标覆盖基类声明,而是隐藏同名的基类方法,不管函数特征标如何。

23210

C++继承

调试发现,学生类和教师类创建的对象中有信息类的成员和成员函数。 定义 这里来说说定义的格式: 派生类也可以叫子类,基类也可以叫做父类。...构造函数: 首先要知道,在子类当中,父类的成员要调用父类的构造函数才能初始化,这里父类的构造函数我们用的缺省值,如果将缺省值去掉,还是像这样去创建子类对象是会报错的。...那么如果在子类想写构造函数,初始化父类的成员函数必须去调用父类的构造函数,不然会报错。...如果基类没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。 拷贝构造: 因为都是内置类型,如果是子类的成员就调用子类的默认拷贝构造,父类的成员就去调用父类的拷贝构造。...那么如果遇到深拷贝的时候,子类就必须去写构造函数了。 在初始化列表中调用父类的拷贝构造就可以了。 派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。

45210
  • C++ 一篇搞懂继承的常见特性

    — 1 — 继承和派生 || 01 继承和派生的概念 继承: 在定义一个新的类 B 时,如果该类与某个已有的类 A 相似(指的是 B 拥有 A 的全部特点),那么就可以把 A 作为一个基类,而把B作为基类的一个派生类...空间上讲,用指针可以节省空间,免于构造 B 对象,而是只在对象中开辟了一个指针,而不是开辟了一个对象 B 的大小。 效率上讲,使用指针适合复用。...---- — 3 — 派生类覆盖其他成员 派生类(子类)可以定义一个和基类(父类)成员同名的成员,这叫「覆盖」。 在派生类(子类)中访问这类成员时,默认的情况是访问派生类中定义的成员。...---- — 5 — 派生类的构造函数 通常在初始化派生类构造函数时,派生类构造函数是要实现初始化基类构造函数的。...第33-36行代码是正确派生类构造函数初始化基类构造函数的方式,通过调用基类构造函数来初始化基类,在执行一个派生类的构造函数 之前,总是先执行基类的构造函数。

    59930

    虚函数

    3、 必须先使用基类指针指向子类型的对象,然后直接或者间接使用基类指针调用虚函数。   ...而不将析构函数定义为虚函数时,只调用基类的析构函数。   (2)只需要在声明函数的类体中使用关键字“virtual”将函数声明为虚函数,而定义函数时不需要使用关键字“virtual”。   ...下面,我们来看一下,如果子类中有虚函数重载了父类的虚函数,会是一个什么样子?假设,我们有下面这样的一个继承关系。   ...为了让大家看到被继承过后的效果,在这个类的设计中,我只覆盖了父类的一个函数:f()。...虽然在上面的图中我们可以看到子类的虚表中有Derive自己的虚函数,但我们根本不可能使用基类的指针来调用子类的自有虚函数:   Base1 *b1 = new Derive();   b1->f1();

    88231

    编译器角度看C++复制构造函数

    如果我们类的数据成员都是内置类型而没有指针,那么简单的浅拷贝是可以接受的,反之如果类中有需要深层复制的内容,则我们的复制构造函数必须以深拷贝的方式进行对象的复制。...当类继承于一个基类而后者有已给复制构造函数时(同样的,无论基类的构造函数是设计者明确声明的还是合成的)。 当类声明了一个或多个虚函数时。 当类派生自一个继承串链,其中有一个或多个虚基类时。...前两种情况中,编译器必须将“类成员或基类的复制构造函数调用操作”安插到新合成的复制构造函数中去,如果类设计者已经明确声明了一个复制构造函数,则这些调用操作代码将插入到已有的复制构造函数中去(在函数体的最前端插入...而对于第4点涉及到虚基类的情况,可以看C++合成默认构造函数的真相中有关虚基类的描述。...虚基类的存在需要特殊处理,一个类对象如果以另一个对象作为初值,而后者派生于虚基类,那么这种情况下bitwise copy语意也会失效,编译器会对派生自虚基类的类合成一个默认构造函数,在其中安插一些操作。

    60670

    【C++】继承

    继承中的作用域 在继承体系中基类和派生类都有独立的作用域。 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,也叫重定义。...(在子类成员函数中,可以使用 基类::基类成员 显示访问) 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。...派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。...,子类中会把父类成员当做一个整体,在子类不写构造时,会调父类的默认构造。...赋值构造 如果没有指明作用域,它和父类是同名函数,会构成隐藏,优先调用自己的,就会死循环。

    12510

    【C++】继承

    所以什么时候我可以把成员定义成私有啊,除了我不想在类外被访问到: ,是不是如果我当前类的某些成员不想被子类使用和访问,也可以把它定义成私有啊。...3.2 隐藏/重定义 那在继承体系中,如果出现这种情况,即子类和父类中有同名成员,它有一个专属的称谓 子类和父类中有同名成员,子类成员将屏蔽对父类同名成员的直接访问(默认访问到的是子类的那一个),这种情况叫隐藏...(在子类成员函数中,可以使用 基类::基类成员 显示访问)。 我们继续,刚才是子类和父类中出现同名的成员变量,那如果是出现同名的成员函数呢?...而我们的Student类里面只定义了一个成员变量_num,其它啥也没写。 但我们看到s自动去调用了它父类的构造和析构。 那如果我子类对象自己显示实现构造函数呢?...如果基类没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。 那其实这里感觉就有点像子类里面有一个父类的自定义类型的成员一样。

    14610

    C++-带你初步走进继承(1)

    子类和父类中有同名成员, 子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏, 也叫重定义。 (在子类成员函数中,可以 使用 基类 :: 基类成员 显示访问 ) 3....因为两个类的作用域是独立的,而构成重载的前提是同一作用域。 如果出现基类和派生类定义了同名成员,可以使用使用 基类::基类成员 显示访问。...派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认 的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。 2....当我自己写了一个Student的构造函数,那么怎么初始化基类的成员呢?可以在初始化列表调用基类的构造函数,然后我们可以看到,是先调用了基类的构造函数,再构造派生类的成员。...那么拷贝构造和赋值重载怎么构造的呢?也是差不多的,使用基类的构造函数完成对基类成员的构造,然后使用赋值的切片,把基类的成员切过去构造。 那析构函数呢?

    14310

    继承

    在基类中,如果没有默认成员函数,我们必须在派生类中显示的写出。...如果基类中有默认成员函数,当派生类中不显示调用的时候,会自动调用。 对于构造函数,都会在初始化列表的时候自动调用基类的构造函数。...这样才能保证先析构派生类,再析构基类 构造函数 1.当基类有默认的构造函数的时候,可以只初始化派生类新的成员变量,也可以自己调用基类的默认构造,看自己的心情。...2.当基类没有默认的构造函数的时候,必须自己要写构造函数调用基类的 派生类的构造函数先初始化基类,再初始派生类中的成员 静态成员变量不属于具体的类对象,属于该类所有对象。...,那么上面的代码就会报错 此时B就应该在初始化列表显示的调用A中的构造函数。

    25640

    【C++】多态

    虚函数的重写(也可以叫覆盖): 派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。...但是在这个地方,我们期望它是这样正常的只调父类的析构吗? 是不是不期望啊,因为如果父类的指针指向的是子类对象,在delete的时候还是只调父类的析构,那是不是就可能会有内存泄漏的风险啊。...那现在大家思考一个问题,test函数里面调用func,是否构成多态? 那我们就看它是否满足多态的两个条件嘛,首先虚函数的重写,这里是满足的,子类对父类的虚函数func进行了重写。...5.2 override 然后再看一个关键字叫做override 他有什么作用呢? override:检查派生类是否对基类的虚函数进行了重写,如果没有重写编译报错。...举个例子来说明抽象类的概念: 假设我们有一个抽象类叫做"动物",其中有一个纯虚函数"发出声音"。我们知道每种动物都会发出声音,但是具体的声音是不同的。

    12410

    python学习32(面向对象_3)

    (200)#子类调用父类的方法 c1.getAttr()#子类调用父类的方法 在子类中调用基类方法 基类.method(self) 如果子类没有定义构造方法,实例化子类对象时候会调用基类的构造方法...注意: 两次参数列表中的self参数都是必不可少的,如果基类的构造方法中有除了self参数外别的参数,调用时,也必须传入同等数量、同等类型的参数。...当子类不定义自己的构造方法时,默认会自动调用父类的构造方法。Python中super函数只能在构造方法中使用。...(默认调用第一个父类的构造方法) ➢如果子类重新定义了自己的构造方法,就不会调用父类的构造方法。...__init__(self, [parameter1[,parameter2....]] ) ➢如果父类中有同名的方法时,通过子类的实例对象去调用的该方法也是第一个父类中的方法。

    37710

    Python中类的声明,使用,属性,实例

    类中的__init__函数:类似于java中的构造函数,以及类的使用 实例如下: #eg:定义一个狗类 class Dog: def __init__(self):   #方法名为 __init...__ 形参必须要带一个self 当然也可以别名 self习惯使然 print("我是一只小狗") #创建一个实例 dog_1 = Dog()           #创建类的实例,也就是调用这个类...输出结果如下: 我是一只小狗 当一个类的实例被创建出来的时候__init__(self)方法就会被自动调用,类似于java,C#中的构造函数。...替代 """ 下面定义两个父类在(父类中创建一个实例函数)和一个子类 子类继承父类: class father: def __init__(self): print("我是父亲...类的实例函数,可见当子类继承了父类之后, 子类也会继承父类的函数,包括实例函数,但是只会继承第一个父类的函数 方法的重写: 当子类继承了父类的函数之后,函数是子类需要的,但是函数体又不是子类需要的。

    5.6K21

    Google C++ 编程风格指南(三):类

    如果你的类中有成员变量没有在类里面进行初始化, 而且没有提供其它构造函数, 你必须定义一个 (不带参数的) 默认构造函数. 把对象的内部状态初始化成一致 / 有效的值无疑是更合理的方式....如果派生类和基类相比引入了新的成员变量, 继承构造函数就会让人迷惑, 因为基类并不知道这些新的成员变量的存在. 结论: 只在能够减少冗余代码, 提高可读性的前提下使用委派和继承构造函数....如果使用继承的话, 定义为 public 继承. 定义: 当子类继承基类时, 子类包含了父基类所有数据及操作的定义....多重继承 真正需要用到多重实现继承的情况少之又少. 只在以下情况我们才允许多重继承: 最多只有一个基类是非抽象类; 其它基类都是以 Interface 为后缀的 纯接口类....> 接口继承 > 私有继承, 子类重载的虚函数也要声明 virtual 关键字, 虽然编译器允许不这样做; 避免使用多重继承, 使用时, 除一个基类含有实现外, 其他基类均为纯接口; 接口类类名以 Interface

    83040

    c++类和继承面试点25连问

    2. c++继承的优点和缺点 优点:根据第1点中讲的,其实继承优点就是实现了代码的重用和接口的重用; 缺点:子类会继承父类的部分行为,父类的任何改变都可能影响子类的行为,也就是说,如果继承下来的实现不适合子类的问题...运行时多态简单来讲就是:使用基类指针或者引用指向一个派生类对象,在非虚继承的情况下,派生类直接继承基类的虚表指针,然后使用派生类的虚函数去覆盖基类的虚函数,这样派生类对象通过虚表指针访问到的虚函数就是派生类的虚函数了...,但是基类函数没有virtual关键字,此时,基类的函数将被隐藏; 总结:函数名相同,参数也相同的情况下,如果基类函数有virtual关键字,则是多态,否则就是隐藏;函数名相同,参数不同的情况下,如果函数位于同一个类中...一个原则:当类中有很少的方法并且有公有数据时,应该使用struct关键字,否则使用class关键字。 15....由成员变量和是否有虚函数决定,如果类中有虚函数,那就在所有成员变量的基础上加上一个虚函数指针的大小,在64位机器中,虚函数指针为8个字节,注意计算类大小的时候要考虑字节对齐的问题。

    99410

    继承

    ,想访问被隐藏的成员,可以借助作用域限定符“::” 子类对象任何时候都可以被当成基类类型对象(皆然性 ISA) 保护继承特点 使基类公有成员和保护成员进行保护化,只禁止外部通过该子类访问 子类指针或引用不能隐式转换成基类类型指针或引用...() { //son s; 无法实例化对象 } 构造析构顺序 子类构造 子类构造函数会调用基类构造函数,构造子类对象中的基类子对象 子类构造函数没有显示指明基类构造方式,会选择基类的缺省构造函数...(无参构造) 子类显示调用基类构造函数可以在初始化表中显示指明构造方式。...构造顺序 在构造析构里面分析过 * 为整个对象分配内存 * 构造基类部分(如果存在基类) * 构造成员变量 * 执行构造函数代码 */ //无参构造 //Student s1; //单参构造...Student s1(18); cin.get(); return 0; } 多继承 一个类可以从多个基类继承 多重继承内存布局 子类对象中的基类子对象按照继承表顺序依次构造 #include

    69520

    C++继承特性详解

    继承的定义: 设想一下,如果我们设计一个学校的教务系统,那我们的对象就会有学生,老师,辅导员,导员等,当然我们可以使用类把他们的信息一个一个存起来,像下面这样: 可以发现,学生,老师,辅导员,导员等...子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏, 也叫重定义。(在子类成员函数中,可以使用 基类::基类成员 显示访问) 3....当然有,如下图: 派生类的默认成员函数: 之前在C++类和对象中篇时,我讲过了类的6个默认成员函数: 1. 派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。...如果基类没有默认 的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。 2. 派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。 3....也就是说每个派生类对象都是一个基类对象。 2.组合是一种has-a的关系。假设B组合了A,每个B对象中都有一个A对象。 3.优先使用对象组合,而不是类继承 。

    20010

    C++终结类

    由于任何派生类的对象在创建的时候,都必需在派生类的构造函数中调用父类的构造函数。所以,只要类的构造函数在子类中无法被访问,那么就阻止了该类被继承,实现终结类。...如果将一个类的构造函数声明为私有(private),可以阻止该类进一步派生,但是该类也无法直接实例化了,此方法行不通。注意,构造函数为private的类,无法直接实例化,但是可以被间接实例化。...一个基类如果被虚拟继承,那么在创建它的孙子类的对象时,该基类的构造函数需要单独被调用。此时,如果该基类的构造函数在孙子类的构造函数中无法访问,那么就实现了基类的子类不能被继承。...将它的默认构造函数的访问权限设定为protected,这样它自身不能产生任何实例,只能用作基类。...一个使用基类FinalParent的实现终结类的例子如下: #include using namespace std; class FinalParent { protected:

    52020

    C++继承分析

    ,以及一个对应的派生类,在派生类的函数中,调用和成员m_nParent,我们没有在派生类中定义这个变量,很明显这个变量来自于基类,子类会继承基类中的函数成员和数据成员,下面的汇编代码展示了它是如何存储以及如何调用函数的...当父类中含有构造函数,而子类中没有时,编译器会提供默认构造函数,这个构造只调用父类的构造,而不做其他多余的操作,但是如果子类中构造,而父类中没有构造,则不会为父类提供默认构造。...在子类中将父类的成员放到内存的前段是为了方便子类调用父类中的成员。但是当子类中有对应的函数,这个时候会直接调用子类中的函数,这个时候发生了覆盖。...通过上面的分析可以知道,在派生类中如果重写了基类中的虚函数,那么在创建新的类对象时会有两次虚表指针的初始化操作,第一次是将基类的虚表指针赋值给对象,然后再将自身的虚表指针赋值给对象,将前一次的覆盖,如果是在基类的构造中调用虚函数...通过上面的代码可以看出,为了使得相同的内容只有一份,在程序中额外传入一个参数作为标记,用于表示是否调用祖父类构造函数,当初始化完祖父类后将此标记置0以后不再初始化,另外程序在每个父类中都多添加了一个四字节的成员用来存储一个一个偏移地址

    53330

    C++实现不能被继承的类——终结类

    所以,只要类的构造函数在子类中无法被访问,那么就阻止了该类被继承,实现终结类。 如果将一个类的构造函数声明为私有(private),可以阻止该类进一步派生,但是该类也无法直接实例化了,此方法行不通。...注意,构造函数为private的类,无法直接实例化,但是可以被间接实例化。间接实例化方法是:类中定义一个公有的静态成员函数,由这个函数来完成对象的初始化工作。...一个基类如果被虚拟继承,那么在创建它的孙子类的对象时,该基类的构造函数需要单独被调用。此时,如果该基类的构造函数在孙子类的构造函数中无法访问,那么就实现了基类的子类不能被继承。...将它的默认构造函数的访问权限设定为protected,这样它自身不能产生任何实例,只能用作基类。...一个使用基类FinalParent的实现终结类的例子如下: #include using namespace std; class FinalParent { protected:

    1.8K30
    领券