精华内容
下载资源
问答
  • 设计一个类不能被继承、设计一个类只能在堆上创建实例,设计一个类只能在栈上创建实例 方式一:把构造函数声明为私有函数(该方法创建的类只能在堆上创建实例) 在C#中关键字sealed,在Java中关键字final它们...

    设计一个类不能被继承、设计一个类只能在堆上创建实例,设计一个类只能在栈上创建实例

    方式一:把构造函数声明为私有函数(该方法创建的类只能在堆上创建实例)

    在C#中有关键字sealed,在Java中有关键字final它们修饰的类不能被继承
    在C++中我们知道,子类的构造函数会自动调用父类的构造函数,子类的析构函数也会自动调用父类的析构函数,所以我们可以把父类的构造函数和析构函数定义为私有函数
    同时我们可以定义两个公有的静态函数来创建对象和释放对象,以达到创建实例的目的

    class A
    {
    public:
          static A* GetA()
          {
                return new A();
          }
          static void DeleteA(A* a)
          {
                delete a;
          }
    private:
          A(){}
          ~A(){}
    };
    
    方式二:利用虚拟继承

    B类使用起来和其它的类型没有什么区别,可以在堆上也可以在栈上创建实例。因为B类是A< B >类的友元类型,所以可以调用它的私有函数
    但如果想从B类继承一个类的话,由于B 类是由A< B >类虚拟继承来的,所以就会跳过B类直接调用A< B >类的构造函数,而别的类并不是A< B >的友元类型所以不能调用

    template <class T>
    class A
    {
          friend T;
    private:
          A(){}
          ~A(){}
    };
    class B :virtual public A<B>
    {
    public:
          B(){}
          ~B(){}
    };
    
    只能在栈上创建实例:

    只有使用new运算符,才会在堆上创建实例,只要禁用new运算符就可以保证只在栈上创建实例

    class B
    {
    public:
          B(){}
          ~B(){}
    private:
          void *operator new(size_t t){}
          void operator delete(void *ptr){}
    };
    
    展开全文
  • 所有类的祖宗是object,所有类只能有一个父亲。Java的单继承指的是一个类不能有多个父亲,而C++就能有好多父亲。举个例子:如果A 没有继承任何类,那他的类层次关系默认是 A -- Object如果A 继承了类B,那他的类层次...

    所有类的祖宗是object,所有类只能有一个父亲。Java的单继承指的是一个类不能有多个父亲,而C++就能有好多父亲。
    举个例子:
    如果A 没有继承任何类,那他的类层次关系默认是 A -- Object
    如果A 继承了类B,那他的类层次关系变为 A -- B -- Object,Object是他爷爷,B是他唯一的父亲,B直接继承Objcet,A间接继承Object

    转载于:https://www.cnblogs.com/CrisZjie180228/p/8728176.html

    展开全文
  • 继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父中不是私有的成员变量和成员方法,作为自己的成员变量和方法。(3)子类中定义的成员变量和父类中定义的成员变量...

    继承的基本概念:
    (1)Java不支持多继承,也就是说子类至多只能有一个父类。
    (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。
    (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。
    (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。

    分析以上程序示例,主要疑惑点是“子类继承父类的成员变量,父类对象是否会实例化?私有成员变量是否会被继承?被继承的成员变量在哪里分配空间?”
    1:虚拟机加载ExtendsDemo类,提取类型信息到方法区。
    2:通过保存在方法区的字节码,虚拟机开始执行main方法,main方法入栈。
    3:执行main方法的第一条指令,new Student(); 这句话就是给Student实例对象分配堆空间。因为Student继承Person父类,所以,虚拟机首先加载Person类到方法区,并在堆中为父类成员变量在子类空间中初始化。然后加载Student类到方法区,为Student类的成员变量分配空间并初始化默认值。将Student类的实例对象地址赋值给引用变量s。
    4:接下来两条语句为成员变量赋值,由于name跟age是从父类继承而来,会被保存在子类父对象中(见图中堆中在子类实例对象中为父类成员变量分配了空间并保存了父类的引用,并没有实例化父类。),所以就根据引用变量s持有的引用找到堆中的对象(子类对象),然后给name跟age赋值。 4:调用say()方法,通过引用变量s持有的引用找到堆中的实例对象,通过实例对象持有的本类在方法区的引用,找到本类的类型信息,定位到say()方法。say()方法入栈。开始执行say()方法中的字节码。
    5:say()方法执行完毕,say方法出栈,程序回到main方法,main方法执行完毕出栈,主线程消亡,虚拟机实例消亡,程序结束。

    总结:相同的方法会被重写,变量没有重写之说,如果子类声明了跟父类一样的变量,那意味着子类将有两个相同名称的变量。一个存放在子类实例对象中,一个存放在父类子对象中。父类的private变量,也会被继承并且初始化在子类父对象中,只不过对外不可见。

    super关键字在java中的作用是使被屏蔽的成员变量或者成员方法变为可见,或者说用来引用被屏蔽的成员变量或成员方法,super只是记录在对象内部的父类特征(属性和方法)的一个引用。啥叫被屏蔽的成员变量或成员方法?就是被子类重写了的方法和定义了跟父类相同的成员变量,由于不能被继承,所以就称作被屏蔽。 说到这里,上面提出的疑惑也就解开了。

    转载于:https://www.cnblogs.com/zhanghengscnc/p/7450904.html

    展开全文
  • //在设计模式中,有一种模式叫“单例模式”,这个模式向我们展现了一个类,这个类只产生一个实例 //这个类里面,屏蔽掉了拷贝构造函数,构造函数,析构函数,这样这个类就不会被继承,因为我们 //知道,当一个类被...

    // only3Instance.cpp : 定义控制台应用程序的入口点。
    //通过此实例实现一个类,这个类不能被继承,并且最多可以实例化3次

    //在设计模式中,有一种模式叫“单例模式”,这个模式向我们展现了一个类,这个类只产生一个实例
    //这个类里面,屏蔽掉了拷贝构造函数,构造函数,析构函数,这样这个类就不会被继承,因为我们
    //知道,当一个类被继承时,子类必须先调用父类的构造函数,在析构时,父类最后被析构,将创建对象的部分定义为一个静态对象,所以只会产生一个实例
    //下面我们仿照这一思路,改变对象“静”的特性,就可以随心所欲的创建对象,同时我们在堆上定义一个变量(static),用来检验
    //对象创建的个数

    #include "stdafx.h"
    #include <process.h>
    #include <iostream>
    using namespace std;

     

     


    class CFinalClass
    {
    public:
     static CFinalClass* GetInstance()
     {
      if (m_index>=m_count)
      {
       return NULL;
      }
      m_index++;
      return new CFinalClass();
     }
     static void SetCount(int n)
     {
      m_count=n;
     }
    private:


     static int m_index;
     static int m_count;


    private://将构造函数和析构函数定义为私有的,这样就不会被继承
     CFinalClass()
     {

     }
     ~CFinalClass()
     {

     }
    };

     

     


    int CFinalClass::m_index=0;
    int CFinalClass::m_count=0;

     

     

     

    int _tmain(int argc, _TCHAR* argv[])
    {

     
     CFinalClass::SetCount(3);
     CFinalClass *p1=CFinalClass::GetInstance();
     CFinalClass *p2=CFinalClass::GetInstance();
     CFinalClass *p3=CFinalClass::GetInstance();
     CFinalClass *p4=CFinalClass::GetInstance();
     CFinalClass *p5=CFinalClass::GetInstance();

     if (p1==NULL)
     {
      cout<<"p1 is null"<<endl;
     }
     else
     {
      cout<<"p1 is not null"<<endl;
     }

     if (p2==NULL)
     {
      cout<<"p2 is null"<<endl;
     }
     else
     {
      cout<<"p2 is not null"<<endl;
     }

     if (p3==NULL)
     {
      cout<<"p3 is null"<<endl;
     }
     else
     {
      cout<<"p3 is not null"<<endl;
     }
     cout<<"-----------------------------------------"<<endl<<endl;
     if (p4==NULL)
     {
      cout<<"p4 is null"<<endl;
     }
     if (p5==NULL)
     {
      cout<<"p5 is null"<<endl;
     }
     system("pause");
     return 0;
    }

     

    展开全文
  • 如上图所示,我们这里模拟一下去车站买票的情形:这里3个柜台同时售票,总共是1000张票,这三个柜台同时买票,但是只能一个柜台卖同一张票,也就是说1号票卖了之后我们就只能买2号票,2号票卖了之后我们只能买3号...
  • 一个.java文件中可以定义多个class,但只能有一个public。final、abstract、class可以有多个。 java中有四种访问权限:public、protected、default、private。 public可访问本、本包的子类、非子类的...
  • 一个类,可以继承自一个普通类,继承它的成员变量和方法;也可同时继承自 一个接口,继承接口的方法并完成定义。有一个神奇的魔法:同一种对象,都是IAct对象,调用同一种方法Act() 。但是执行的情况却完全不一样。...
  • 方法一:对于在开发环境中,在本项目中找出一个类所有的子类或实现类比较简单,即使是多模块项目,只要以项目根目录为起点,遍历所有.java结尾的类的路径,用Class.forName(classPath)得到该类 ,然后class1....
  • 所有类的祖宗是object,所有类只能有一个父亲。Java的单继承指的是一个类不能有多个父亲,而C++就能有好多父亲。举个例子:如果A 没有继承任何类,那他的类层次关系默认是 A -- Object如果A 继承了类B,那他的类层次...
  • 继承是一种由已有的的类创建新类的机制,由继承得到的类称为子类,被继承的类称为父类(超类),Java不支持多重继承,子类只能有一个父类 子类 通过使用关键字extends来定义一个类子类,格式如下: class 子类...
  • (2)但是这种方式会有一个问题,因为父类的构造函数是私有的则父类也构造不出来对象。 (3)为了解决父类构造不出来对象的问题,则可以在父类定义一个GetObject方法,里面调用父类的构造函数,则可以通过调用Get.....
  • 在实际工程中,如果一个类的对象重复持有资源的成本很高,且对外接口是线程安全的,我们往往倾向于将其以单例模式管理。 此篇我们在 C++ 中实现正确的单例模式。 选型 在 C++ 中,单例模式两种方案可选。 一是...
  • C#的继承:子类--父类

    千次阅读 2018-10-15 17:02:58
    为了避免冗余,将几个类中重复的成员单独拿出来封装成一个类,作为这几个类的父类。 父类---子类 基类----派生类 子类没有继承到父类的私有(private)字段,...1、一个子类只能有一个父类(单根性) 2、可以...
  • 原文章: java异常类子类和父类的关系 ... 在java 中,当我们子类要重写父类中的方法,如果父类的方法异常声明,那么子类重写这个方法时候,所要声明的异常不...假如我们自定意义一个异常: public class My...
  • 1.基本数据类型 基本数据类型: 子类可以强转成父类,因为小范围可以强转大范围,不会数据丢失。 父类也可以强转成子,但是因为大范围强转成小范围,...如果子类中重写了父类中的一个方法,那么在调用这个方法
  • 比如我有子类son继承自父类father。...eclipse的outline中只能看见son自己的方法,没有什么办法可以让我清晰的看见son中所有的方法,包括从父类继承来的?这样我可以方便的分析源码 求高手……
  • 接口自身不能实例化,接口的方法定义/实现只能由接口子类来完成。 而对于C++,其接口一般具有以下特征: 1.最好不要成员变量,但可以静态常量(static const或enum) 2.要纯虚接口方法 3.要虚析构...
  • 因为除了Object类,每个类有一个父类; 父类中的非静态成员变量的赋值操作,只能由父类的构造函数去完成; 所以子类的构造函数中,必须先调用父类构造函数,给父类的非静态成员变量显示赋值; 2、子类构造函数...
  • 一个字体按钮(WTL)

    2011-01-18 15:46:00
    一个是button按钮的子类化,产生一个有立体感的字体(本站上的一个例子是用MFC做的CMyTextButton,我把它移植到WTL中,封装成CFontButton,在这里先感谢提供此代码的作者),不过只能显示英文字体。通过这些例子,...
  • 编写一个动物基类,动物基类的属性有跑,飞,游泳三个,让猪、鱼、鸟这三个类继承动物类,但是每个对应的只能有自己特有的属性,比如猪肯定不能飞(飞猪?肥猪)!#include "stdafx.h" #include using namespace ...
  • 继承父类子类

    2019-04-24 21:49:32
    一个子类只能有一个父类。 4.如果子类和父类不在同一个包中,子类可以继承父类的哪些成员? 可以继承父类中被public,protected 修饰的成员变量和成员方法。(继承的成员变量或方法的访问权限不变) 如果在同一个...
  • Java 自定义异常(Exception的子类

    千次阅读 2020-04-04 15:42:10
    定义了一个Word,该是单词,根据单词的业务逻辑,单词中只能含有a~z、A~Z里的字符,但是在初始化Word对象可能会含有其他字符,当含有其他字符时,就让程序报错。 如何自定义异常? 所有异常的最终父类...
  • 子类与继承

    千次阅读 2018-12-10 21:16:26
    一、子类与父类 object是所有的祖先。 1、子类与继承 (1)关键字:extends class 子类名...(2)继承特性:java不支持多继承,一个子类只能有一个父类 同一包中:不继承private修饰的成员变量与方法 ...
  • 当我们拿到一个有超类、有子类、包括主程序的入口的程序去分析它运行步骤时: 1.程序应当从入口类类(含有public的,即就是1个.java文件中只能包含一个public,它就是入口)开始; 2.你一定要明确的是在...
  • A:Java不支持多重继承,即一个子类只能有一个父类 Q:Java的没有使用extends关键字的话,默认是哪个的子类? A:Object,任何都是Object的子孙(Object是java.lang包中的)。 Q :对于不同访问...
  • 其实我们根本没法写出满足字面要求的代码, 其实我们要实现的是:写一个类, 使继承这个类的子类不能实例...这个方法有一个缺点: 我们只能通过下面的方式创建对象了 1.在static成员函数(也可以是友元函数)中返回一个局部

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,579
精华内容 1,831
关键字:

一个类只能有一个子类