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

为什么抽象类的构造函数应该受到保护而不是公开?

在面向对象编程中,抽象类是一种特殊的类,它不能被实例化。抽象类通常包含一个或多个抽象方法,这些方法没有具体的实现,需要由子类来实现。抽象类的构造函数应该受到保护而不是公开,原因如下:

  1. 抽象类通常是一个基类,它可能有多个子类。如果抽象类的构造函数是公开的,那么任何人都可以直接实例化该抽象类,这显然是不合适的,因为抽象类不能被实例化。
  2. 抽象类通常是一个基类,它可能有多个子类。如果抽象类的构造函数是公开的,那么任何人都可以直接实例化该抽象类,这显然是不合适的,因为抽象类不能被实例化。
  3. 抽象类通常是一个基类,它可能有多个子类。如果抽象类的构造函数是公开的,那么任何人都可以直接实例化该抽象类,这显然是不合适的,因为抽象类不能被实例化。
  4. 抽象类通常是一个基类,它可能有多个子类。如果抽象类的构造函数是公开的,那么任何人都可以直接实例化该抽象类,这显然是不合适的,因为抽象类不能被实例化。
  5. 抽象类通常是一个基类,它可能有多个子类。如果抽象类的构造函数是公开的,那么任何人都可以直接实例化该抽象类,这显然是不合适的,因为抽象类不能被实例化。
  6. 抽象类通常是一个基类,它可能有多个子类。如果抽象类的构造函数是公开的,那么任何人都可以直接实例化该抽象类,这显然是不合适的,因为抽象类不能被实例化。
  7. 抽象类通常是一个基类,它可能有多个子类。如果抽象类的构造函数是公开的,那么任何人都可以直接实例化该抽象类,这显然是不合适的,因为抽象类不能被实例化。
  8. 抽象类通常是一个基类,它可能有多个子类。如果抽象类的构造函数是公开的,那么任何人都可以直接实例化该抽象类,这显然是不合适的,因为抽象类不能被实例化。
  9. 抽象类通常是一个基类,它可能有多个子类。如果抽象类的构造函数是公开的,那么任何人都可以直接实例化该抽象类,这显然是不合适的,因为抽象类不能被实例化。
  10. 抽象类通常是一个基类,它可能有多个子类。如果抽象类的构造函数是公开的,那么任何人都可以直接实例化该抽象类,这显然是不合适的,因为抽象类不能被实例化。

因此,抽象类的构造函数应该受到保护,而不是公开。这样可以保证抽象类不会被实例化,同时也可以保证子类在实例化时可以正确地初始化基类的状态。

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

相关·内容

构造函数为什么一般不定义为虚函数析构函数一般写成虚函数原因 ?

浏览量 3 1、构造函数不能声明为虚函数 1)因为创建一个对象时需要确定对象类型,函数是在运行时确定其类型。...而在构造一个对象时,由于对象还未创建成功,编译器无法知道对象实际类型,是类本身还是类派生类等等 2)虚函数调用需要虚函数表指针,该指针存放在对象内存空间中;若构造函数声明为虚函数,那么由于对象还未创建...,还没有内存空间,更没有虚函数表地址用来调用虚函数构造函数了 2、析构函数最好声明为虚函数,首先析构函数可以为虚函数,当析构一个指向派生类基类指针时,最好将基类析构函数声明为虚函数,否则可以存在内存泄露问题...如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除指向派生类基类指针时,只会调用基类析构函数不调用派生类析构函数,这样就会造成派生类对象析构不完全。子类析构时,要调用父类析构函数吗?...析构函数调用次序时先派生类后基类。和构造函数执行顺序相反。并且析构函数要是virtual,否则如果用父类指针指向子类对象时候,析构函数静态绑定,不会调用子类析构。

57410

是否还在疑惑Vue.js中组件data为什么函数类型不是对象类型

Vue() //此时vm1应该是这样 vm1 = { //这里data,是先获取了函数Vue中data(data值为函数),然后得到了data返回值 this.data = {...55' } } //创建了一个Vue实例,会调用上面的定义函数 let vm1 =new Vue() //此时vm1应该是这样 vm1 = { //这里data是获取了函数Vue中data...= { name: '李四', age: '55' } } //创建了一个Vue实例,会调用上面的定义函数 let vm2 =new Vue() //此时vm1应该是这样 vm2...因为我们刚开始定义了构造函数Vue时,给他内部data设置了一个值,该值为对象类型,对象类型在js中称为引用数据类型,在栈中是存储着一个指向内存中该对象堆中地址。...因为本文也是说到构造函数创建实例对象概念,如果对于JavaScript中对象概念不理解的话,也可以翻阅我之前写一篇文章,全面剖析了js中对象概念——充分了解JavaScript中对象,顺便弄懂你一直不明白原型和原型链

3.4K30

框架篇-Vue面试题1-为什么 vue 组件中 data 是函数不是对象

在vue组件中data属性值是函数,如下所示 export default { data() { // data是一个函数,data: function() {}简写 return...,定义组件可以复用在多个页面 如果data是一个纯碎对象,则所有的实例将共享引用同一份data数据对象,无论在哪个组件实例中修改data,都会影响到所有的组件实例 如果data是函数,每次创建一个新实例后...,调用data函数,从而返回初始数据一个全新副本数据对象 这样每复用一次组件,会返回一份新data数据,类似于给每个组件实例创建一个私有的数据空间,让各个组件实例各自独立,互不影响,保持低耦合 可以看下面一段代码...// 声明构造函数 function Person() {} Person.prototype.data = { // 原型下挂载一对象,并有name属性 name: 'itclanCoder...(p1,p2)都指向是同一份实体 原型下属性相当于是公有的 修改一个实例对象下属性,也会造成另一个实例属性跟着改变,这样在组件复用时候,肯定是不行,那么改成函数就可以了,如下代码所示 function

1.9K20

C++重要知识点小结---2

这种类成为抽象类。 一个抽象类至少具有一个纯虚函数。所谓纯虚函数是指被标明为不具体实现虚成员函数。...该声明是为派生类保留位置。 一个抽象类不能有实例对象,即不能由该类抽象来制造一个对象。 纯虚函数是在基类中为子类保留一个位置,以便子类用自己实在函数定义来重载之。...“第二种”和“第四种”情况则不包括vptr_b_a这个指针,这回应该木有问题了 吧。...一个私有的或保护派生类不是子类,因为非公共派生类不能做基类能做所有的事。 保护继承与私有继承类似,继承之后类相对于基类来说是独立保护继承类对象,在公开场合同样不能使用基类成员。...,指向Circle或者是Square 一个有意思问题:为什么析构函数要设置成虚函数 Range *r1 = new Circle(3, 4); 如果析构函数不是函数,则r1在释放内存时,则调用提Range

66970

C++重要知识点小结---2

这种类成为抽象类。 一个抽象类至少具有一个纯虚函数。所谓纯虚函数是指被标明为不具体实现虚成员函数。...该声明是为派生类保留位置。 一个抽象类不能有实例对象,即不能由该类抽象来制造一个对象。 纯虚函数是在基类中为子类保留一个位置,以便子类用自己实在函数定义来重载之。...“第二种”和“第四种”情况则不包括vptr_b_a这个指针,这回应该木有问题了 吧。...一个私有的或保护派生类不是子类,因为非公共派生类不能做基类能做所有的事。 保护继承与私有继承类似,继承之后类相对于基类来说是独立保护继承类对象,在公开场合同样不能使用基类成员。...,指向Circle或者是Square 一个有意思问题:为什么析构函数要设置成虚函数 Range *r1 = new Circle(3, 4); 如果析构函数不是函数,则r1在释放内存时,则调用提Range

77470

设计规则

CA1012:抽象类型不应具有构造函数 抽象类构造函数只能由派生类型调用。 由于公共构造函数用于创建类型实例,但无法为抽象类型创建实例,因此具有公共构造函数抽象类在设计上是错误。...CA1030:在适用处使用事件 该规则检测名称通常用于事件方法。 如果为响应明确定义状态更改调用一个方法,则应由事件处理程序调用该方法。 调用该方法对象应引发事件不是直接调用该方法。...捕捉更具体异常,或者在执行 catch 块中最后一条语句时重新引发一般异常。 CA1032:实现标准异常构造函数 如果不能提供完整构造函数集,要正确处理异常将变得比较困难。...而且,如果没有读访问,将无法查看共享对象状态,使其用处受到限制。...应使用 sealed 修饰符标记不希望被继承类型,以免将其用作基类型。 CA1053:静态容器类型不应具有构造函数 公共或嵌套公共类型只声明了静态成员,但具有公共或受保护默认构造函数

2K20

TypeScript 官方手册翻译计划【十二】:类

公开保护成员 派生类需要遵循其基类约束,但可以选择公开具有更多功能基类子类。...关于 C# 为什么会认为这段代码是不合法,可以阅读这篇文章了解更多信息:为什么我无法在一个派生类中去访问一个受保护成员?...在这个例子中,由于我们通过 obj 引用去调用函数,所以它 this 值是 obj,不是类实例。 这通常不是我们期望结果!...这种方法利弊权衡和上面使用箭头函数方法相反: JavaScript 调用方可能仍然会在没有意识情况下错误地调用类方法 只会给每个类定义分配一个函数不是给每个类实例分配一个函数 仍然可以通过...有时候你想要接受一个类构造函数作为参数,让它产生某个类实例,并且这个类是从某个抽象类派生过来

2.5K10

初识字节流+实现缓冲字节流OutputStream主要方法构造方法读关流实现BufferedInputStream实现BufferedOutputStream为什么read()返回是Int型不是

,区别就是字节流操作字节,字符流操作字符 ---- OutputStream OutputStream主要方法 构造方法 以FileOutputStream为例 FileOutputStream(...个元素 刷新 flush() close() ---- InputStream 构造方法 照惯例,以FileInputStream为例 FileInputStream(String filename...,可以用来知道文件大小 available():int; 返回文件字节数 这时就可以用这个方法来定义array大小,那么就可以一次性读完了 关流 flush() ---- 缓冲技术 缓冲技术就是把信息分批处理...,从数组中一个个读到控制台 输出缓冲就是把数据存到数组中,再一起写到OutputStream中缓冲区,最后在刷新 刚刚用这个复制一个11.1MMP3花了0.6秒,和系统时间差不多↖(^ω^)...---- 错误返回了-1 如果扫描到了11111111那么此时将byte->int是-1,如果这样的话,程序就会终止不会进行 为什么read()返回是Int型不是byte型呢??

1.2K80

C#简单面试题目(一)

protected:保护成员,该类内部和继承类中可以访问。   public:公共成员,完全公开,没有访问限制。   internal:在同一个程序集内可以访问....抽象类中可以有方法实现,也可以定义非静态类变量。抽象类是类,所以只能被单继承,但是接口却可以一次实现多个。抽象了可以提供某些方法部分实现,接口不可以。抽象类实例是它子类给出。...接口成员被定义为公共,但抽象类成员也可以是私有的、受保护、内部、或受保护内部成员(其中受保护内部成员只能在应用程序代码或派生类中访问)。...此外接口不能包含字段、构造函数、析构函数、静态成员或常量。 11.什么是抽象类(Abstract Class)?   一种不可以被实例化类。抽象类中一般含有抽象方法,当然也可以有具体实现。...13.为什么不能指定接口中方法修饰符?   接口中方法用来定义对象之间通信契约,指定接口中方法为私有或保护没有意义。他们默认为共有方法。 14.如果接口中存在重复方法名称该如何?

94530

PHP基础之面向对象篇

> 如果我们这样写,我们认为会输出:我是构造函数小可爱18,但是,最后只会输出我是构造函数。这位为什么呢? 之前我们说过,构造函数也是函数,也会开一个新栈。这里他会把name和age当成一个新变量。...public(公开)、protected(受保护)、private(私有的) 正因为有了protected(受保护)、private(私有的)这两个修饰符,才能体现封装概念。...> 这样就体现了封装概念,protected(受保护)、private(私有的)这两个修饰符修饰变量不让你直接调用。 如果,我们想要调用呢,那就写一个公开方法,调用那个方法就可以了。...子类方法不能缩小父类方法访问权限,可以扩大。 上面的内容体现了面向对象多态性。 抽象类 提一个问题,为什么设计抽象类。...接口中方法必须是public,默认就是public,你想想,你接口就是给别人用,你不公开不是没事嘛。 一个接口不能继承其他类,但是可以继承别的接口。

62930

c#接口interface学习

接口成员被定义为公共,但抽象类成员也可以是私有的、受保护、内部或受保护内部成员 (其中受保护内部成员只能在应用程序代码或派生类中访问)。...此外接口不能包含字段、构造函数、析构函数、静态成员或常量。 还有一点,我们在VS中实现接口时会发现有2个选项,一个是实现接口,一个是显示实现接口。...实现接口就是我们平常理解实现接口,而显示实现接口的话,实现方法是属于接口不是属于实现类。...此外接口不能包含字段、构造函数、析构函数、静态成员或常量。 还有一点,我们在VS中实现接口时会发现有2个选项,一个是实现接口,一个是显示实现接口。...实现接口就是我们平常理解实现接口,而显示实现接口的话,实现方法是属于接口不是属于实现类

57320

JavaScript中类有什么问题呢?

这就是他们真正做,在我们已经拥有的原型继承之上添加了一些构成,并决定将其称为类,这反过来又让开发人员认为他们正在处理一种面向对象语言,实际上它们并不是。...这是否意味着我们应该停止使用类? 当然不是,重要是要理解它,而且如果我们想做些突破类限制,那么我们就必须用原型来处理。 JS OOP 模型缺失了什么呢?...抽象类 每当我尝试对我代码进行完整OOP操作时,我肯定会错过JS中抽象类抽象类是定义和实现方法类,但永远不会实例化。 这是一种可以扩展但从未直接使用常见行为分组方式。...受保护属性和方法 我们已经有了公开可见性,而且我们很快就得到了方法和属性私有可见性(通过#前缀)。...我认为下一步应该是添加受保护可见性,然而,现在还没有,我认为如果你想要有一个合适OOP体验,这三个都是必要

1.4K10

PHP抽象类与接口区别实例详解

本文实例讲述了PHP抽象类与接口区别。分享给大家供大家参考,具体如下: 抽象类abstract 概念 定义为抽象类不能被实例化。...例如,某个抽象方法被声明为proteced,那么子类中实现,就应该声明为protected或者public,不能定义为private。...方法调用方式必须匹配,即类型和所需参数数量必须一致,例如,子类定义了一个可选参数,父类抽象方法中没有声明,则两者声明并没有冲突。 特点 抽象类继承,使用关键字extends。...抽象类可以声明各种变量、常量、方法。 抽象类可以有构造函数抽象类方法可以是公开public、保护protected、私有的private。 一个类只能继承一个抽象类。...接口中没有构造函数。 接口中方法默认都是公开public。 一个类可以实现多个接口。 示例 示例一 、 实现接口 <?

43900

PHP抽象类与接口区别实例详解

例如,某个抽象方法被声明为proteced,那么子类中实现,就应该声明为protected或者public,不能定义为private。...方法调用方式必须匹配,即类型和所需参数数量必须一致,例如,子类定义了一个可选参数,父类抽象方法中没有声明,则两者声明并没有冲突。 特点 抽象类继承,使用关键字extends。...抽象类可以声明各种变量、常量、方法。 抽象类可以有构造函数抽象类方法可以是公开public、保护protected、私有的private。 一个类只能继承一个抽象类。 示例 示例一 <?...要实现一个接口,使用implements操作符,类中必须实现接口中定义所有方法。 特点 接口实现,使用关键字implements。 接口中不能声明变量,但是可以声明常量。 接口中没有构造函数。...接口中方法默认都是公开public。 一个类可以实现多个接口。 示例 示例一 、 实现接口 <?

58520

JavaScript中类有什么问题

这就是他们真正做,在我们已经拥有的原型继承之上添加了一些构成,并决定将其称为类,这反过来又让开发人员认为他们正在处理一种面向对象语言,实际上它们并不是。...这是否意味着我们应该停止使用类? 当然不是,重要是要理解它,而且如果我们想做些突破类限制,那么我们就必须用原型来处理。 JS OOP 模型缺失了什么呢?...抽象类 每当我尝试对我代码进行完整OOP操作时,我肯定会错过JS中抽象类抽象类是定义和实现方法类,但永远不会实例化。 这是一种可以扩展但从未直接使用常见行为分组方式。...受保护属性和方法 我们已经有了公开可见性,而且我们很快就得到了方法和属性私有可见性(通过#前缀)。...我认为下一步应该是添加受保护可见性,然而,现在还没有,我认为如果你想要有一个合适OOP体验,这三个都是必要

1.6K10

框架设计原则和规范(二)

优先定义类不是接口 我们可以给类添加成员,接口则需要使用者修改代码 1.3.2. 要用抽象类不是接口解除契约与实现之间耦合 1.3.3....构造函数应该是protected或者private 1.4.2. 至少定义一个该抽象类具体实现类型 要通过实际使用验证抽象类设计问题 1.5. 静态类设计 1.5.1....不要使用公共嵌套类型来做逻辑分组,而应该使用名字空间 1.9.3. 避免公开暴露嵌套类型 1.9.4. 嵌套类如果会被他外层类之外类引用,则不应该定义嵌套类 1.9.5....构造函数中只应该做最少工作 处理所引起开销应该推迟到真正需要时候 2.3.6....要用System.Eventhandler来定义事件处理函数不是手工创建新委托来定义事件处理函数 2.4.3.

1.4K50

Android入门教程(五)

面向对象是一种编程方法 面向对象是一种思维方式 面向对象不是一种编程语言 应该如何学习面向对象?...对象使用方法 使用对象调用变量和函数 对象.变量 对象.函数() 生成多个对象 匿名对象使用 可以不定义对象引用名称,直接调用这个对象方法,这样对象叫做匿名对象。...调用子类构造函数,一定会调用父类构造函数。...,其他类来继承它,就是当爹 抽象类可以有构造函数吗?...结论: 抽象函数就是没有函数函数 抽象类使用abstract来定义 抽象类不能生成对象,但是却可以拥有构造函数,这个构造函数是为了子类准备。 24为什么抽象类

33720

Java-抽象与接口

在面向对象概念中,所有的对象都是通过类来描绘,但是反过来,并不是所有的类都是用来描绘对象,如果一个类中没有包含足够信息来描绘一个具体对象,这样类就是抽象类。...在Java中抽象类表示是一种继承关系,一个类只能继承一个抽象类一个类却可以实现多个接口。 抽象类 不该被创建对象。...所以,Animal不应该被独立创建成对象。 如何限制这种对象创建呢?便引入了抽象类概念。...派生自抽象类类必须实现纯虚函数或者它们必须也是抽象类。 请考虑虚函数中所述示例。 类 Account 用途是提供通用功能,但 Account 类型对象太通用,因此没什么用。...没有构造方法,不能创建对象。 只能定义:公开静态常量、公开抽象方法。

16720

c#面试题抽象类和接口区别-最新数数网笔试题和面试题答案

抽象类中可以有方法实现,也可以定义非静态类变量。抽象类是类,所以只能被单继承,但是接口却可以一次实现多个。抽象类可以提供某些方法部分实现,接口不可以。抽象类实例是它子类给出。...接口实例是实现接口类给出。再抽象类中加入一个方法,那么它子类就同时有了这个方法。而在接口中加入新方法,那么实现它类就要重新编写(这就是为什么说接口是一个类规范了)。...接口成员被定义为公共,但抽象类成员也可以是私有的、受保护、内部或受保护内部成员(其中受保护内部成员只能在应用程序代码或派生类中访问)。...此外接口不能包含字段、构造函数、析构函数、静态成员或常量。   2、结构和类有什么异同?...结构是值类型,只能继承接口,不能被继承,没有默认构造函数,可以创建,没有析构函数,不可以用和sealed,没有修饰符,可以不用new初始化。

27010
领券