`
kmplayer
  • 浏览: 509796 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

实现:不能被继承的类

阅读更多
1,首先想到的是在C++ 中,子类的构造函数会自动调用父类的构造函数。同样,子类的析构函数也会自动调用父类的析构函数。要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函数。那么当一个类试图从它那继承的时候,必然会由于试图调用构造函数、析构函数而导致编译错误。

2,可是这个类的构造函数和析构函数都是私有函数了,我们怎样才能得到该类的实例呢?
我们可以通过定义静态来创建和释放类的实例。

3,先看一个基本的实现:
实例代码:
#include <iostream>
using namespace std ;

class FinalClass
{
private: //public:
    //只把构造函数设置为私有就可以了.
    FinalClass(int i = 3) : val(i) {}
public:
    static FinalClass GetInstance(int i = 3) //设法返回对象
    {
        FinalClass tmp(i);
        return tmp;
    }
    int getVal()
    {
        return val;
    }
private:
    int val;
};

class DFinal : public FinalClass
{
public:
};

int main()
{
    FinalClass f1 = FinalClass::GetInstance(3);
    cout << f1.getVal() << endl;
    DFinal f2;
    cout << f2.getVal() << endl;
	return 0 ;
}

4,一个借助于模板的巧妙实现:
#include <iostream>
using namespace std ;

template<typename T>
class MakeFinal
{
    friend T; //这里编译有错
private:
    MakeFinal() {}
    ~MakeFinal() {}
};

class FinalClass : virtual public MakeFinal<FinalClass>
{
public:
    FinalClass() {}
    ~FinalClass() {}
};

/*
class Try : public FinalClass
{
public:
    Try() {}
    ~Try() {}
};
*/

int main()
{
	return 0 ;
}

解析:
由于类FinalClass是从类MakeFinal<FinalClass>虚继承过来的,在调用Try的构造函数的时候,会直接跳过FinalClass而直接调用MakeFinal<FinalClass>的构造函数。非常遗憾的是,Try不是MakeFinal<FinalClass2>的友元,因此不能调用其私有的构造函数。


分享到:
评论

相关推荐

    C++实现一个不能被继承的类

    用C++实现一个不能被继承的类,适合初学者

    C++不能继承的类

    标题所提到的"不能继承的类",其目的是为了实现一种类的封闭性,确保其设计的意图不被误用。描述中提到了几种实现方法,主要涉及类的构造函数的访问权限、友元机制以及虚继承的应用。 首先,C++中可以通过将类的...

    Java中extends类的继承

    - `private`:私有成员不被继承,不能在子类中访问。 4. **构造器与继承** - 子类可以通过`super`关键字调用父类的构造器,确保父类的初始化。 - 如果子类没有显式调用父类构造器,Java会自动添加一个隐式的`...

    python继承和抽象类的实现方法

    抽象类则是一种不能直接实例化的类,它为子类提供了一种规范,强制子类实现某些方法。 首先,我们来看一下继承的实现。在给定的代码示例中,`Employee` 类被定义为其他类的基础,即父类。在Python中,我们可以使用...

    Python语言基础:类的多重继承.pptx

    首先,我们定义了一个基础类`Animal`,它有一个方法`how_to_live()`,表示所有动物都需要吃东西而不能进行光合作用。然后,我们根据生物的特征,创建了两个子类`Mammal`和`Bird`,它们都继承自`Animal`。`Mammal`类...

    采用普通类,接口,和抽象类实现单继承和多继承增,删,改,查

    本主题将深入探讨如何使用普通类、接口和抽象类来实现这些继承方式,并应用到“增、删、改、查”(CRUD,Create, Read, Update, Delete)操作中。 首先,单继承是指一个子类只能继承一个父类的特性。这种方式使得...

    C++程序设计课件:第16章 继承.ppt

    抽象类含有纯虚函数,不能被实例化,但可以作为其他类的基类。它们定义了一组接口,但不提供具体实现。 16.14 由抽象类派生具体类: 具体类可以继承抽象类,并为纯虚函数提供实现,从而形成可实例化的类。 16.15 ...

    C 程序设计课件:第16章 继承.ppt

    - **私有继承(private inheritance)**:基类的公有和保护成员在派生类中变为私有,派生类内部可以访问,外部不能。 - **保护继承(protected inheritance)**:基类的公有和保护成员在派生类中保持为保护成员,...

    JAVA 继承基本类、抽象类、接口区别与联系

    **定义**:抽象类是一种特殊的类,它不能被实例化,但可以作为其他类的父类。抽象类使用`abstract`关键字定义,可以包含抽象方法(只有声明没有实现的方法)和非抽象方法(即普通方法)。 **特点**: 1. **抽象方法...

    清华大学C++进阶讲义:第7章类的继承.pdf

    在公有继承中,基类的public和protected成员可以被派生类中的成员函数直接访问,但不能直接访问基类的private成员。通过派生类的对象只能访问public成员。例如: ```cpp class Point { public: void initPoint...

    类的继承、抽象类、虚方法实现

    抽象类是一种不能被实例化的类,它用于定义共同接口,供其他类继承。在C#中,我们使用`abstract`关键字声明抽象类。例如,我们可能有一个`Animal`抽象类,其中包含一个抽象方法`MakeSound()`: ```csharp public ...

    继承类的源代码

    这个"继承类的源代码"文件集合,可能是为了演示如何在OC中实现继承机制以及在实际项目中的应用。以下是对这一主题的详细解释。 1. **继承的基本概念**: 继承允许我们创建一个新类(子类或派生类),该类基于已...

    Java--类的继承

    - 抽象类是不能实例化的类,它可能包含抽象方法(没有实现的方法)。使用`abstract`关键字定义,如`abstract class AbstractClass` - 子类继承抽象类必须实现所有抽象方法,除非子类也是抽象类 - 抽象类用于定义...

    animal 类的继承

    在这里,`Animal` 类具有一个构造函数来初始化动物的名字,一个 `eat()` 方法表示所有动物都能吃,以及一个纯虚函数 `makeSound()`,这要求任何继承 `Animal` 的类都必须提供自己的声音实现。 **子类的实现** `Dog...

    C++课程-4_继承与派生

    )则定义了一个抽象基类,它不能被实例化,通常用于接口设计。 5. **覆盖与重载**:派生类可以重新定义基类的虚函数,这就是覆盖。而重载是指在同一个作用域中,用相同的函数名称但参数列表不同的函数,它们是完全...

    表面积和体积_抽象类Shape_shape类继承_

    抽象类是一种特殊的类,它不能被实例化,主要用来作为其他类的基类,提供一些通用的方法或属性。在C++中,我们通过包含至少一个纯虚函数(即只有声明没有实现的虚函数)来定义抽象类。这里的`Shape`类就是这样一个...

    1.1:抽象方法与抽象类.pdf

    抽象类与抽象方法由abstract修饰 ...1.抽象类不能被实例化,只能被其他类继承 2.继承抽象类的子类必须把抽象类中的所有抽象成员都重写(实现)(除非子类也是抽象类。) 3.抽象类就是为了重写→多态。

    C++实现继承

    例如,在公有继承中,派生类成员函数可以直接访问基类的公有和保护成员,但不能直接访问基类的私有成员。而通过派生类的对象,只能访问基类的公有成员。 #### 类用户的概念 在继承的背景下,类可以有三种不同类型...

    Java程序设计课件:第四章 继承与多态.ppt

    final 关键字可以用来修饰类、方法和变量,表示它们不能被继承或修改。super 关键字可以用来访问父类的成员变量和方法。 本章主要讲解了 Java 中的继承和多态机制,包括继承的基本知识、父类和子类的关系、继承的...

Global site tag (gtag.js) - Google Analytics