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++中可以通过将类的...
- `private`:私有成员不被继承,不能在子类中访问。 4. **构造器与继承** - 子类可以通过`super`关键字调用父类的构造器,确保父类的初始化。 - 如果子类没有显式调用父类构造器,Java会自动添加一个隐式的`...
抽象类则是一种不能直接实例化的类,它为子类提供了一种规范,强制子类实现某些方法。 首先,我们来看一下继承的实现。在给定的代码示例中,`Employee` 类被定义为其他类的基础,即父类。在Python中,我们可以使用...
首先,我们定义了一个基础类`Animal`,它有一个方法`how_to_live()`,表示所有动物都需要吃东西而不能进行光合作用。然后,我们根据生物的特征,创建了两个子类`Mammal`和`Bird`,它们都继承自`Animal`。`Mammal`类...
本主题将深入探讨如何使用普通类、接口和抽象类来实现这些继承方式,并应用到“增、删、改、查”(CRUD,Create, Read, Update, Delete)操作中。 首先,单继承是指一个子类只能继承一个父类的特性。这种方式使得...
抽象类含有纯虚函数,不能被实例化,但可以作为其他类的基类。它们定义了一组接口,但不提供具体实现。 16.14 由抽象类派生具体类: 具体类可以继承抽象类,并为纯虚函数提供实现,从而形成可实例化的类。 16.15 ...
- **私有继承(private inheritance)**:基类的公有和保护成员在派生类中变为私有,派生类内部可以访问,外部不能。 - **保护继承(protected inheritance)**:基类的公有和保护成员在派生类中保持为保护成员,...
**定义**:抽象类是一种特殊的类,它不能被实例化,但可以作为其他类的父类。抽象类使用`abstract`关键字定义,可以包含抽象方法(只有声明没有实现的方法)和非抽象方法(即普通方法)。 **特点**: 1. **抽象方法...
在公有继承中,基类的public和protected成员可以被派生类中的成员函数直接访问,但不能直接访问基类的private成员。通过派生类的对象只能访问public成员。例如: ```cpp class Point { public: void initPoint...
抽象类是一种不能被实例化的类,它用于定义共同接口,供其他类继承。在C#中,我们使用`abstract`关键字声明抽象类。例如,我们可能有一个`Animal`抽象类,其中包含一个抽象方法`MakeSound()`: ```csharp public ...
这个"继承类的源代码"文件集合,可能是为了演示如何在OC中实现继承机制以及在实际项目中的应用。以下是对这一主题的详细解释。 1. **继承的基本概念**: 继承允许我们创建一个新类(子类或派生类),该类基于已...
- 抽象类是不能实例化的类,它可能包含抽象方法(没有实现的方法)。使用`abstract`关键字定义,如`abstract class AbstractClass` - 子类继承抽象类必须实现所有抽象方法,除非子类也是抽象类 - 抽象类用于定义...
在这里,`Animal` 类具有一个构造函数来初始化动物的名字,一个 `eat()` 方法表示所有动物都能吃,以及一个纯虚函数 `makeSound()`,这要求任何继承 `Animal` 的类都必须提供自己的声音实现。 **子类的实现** `Dog...
)则定义了一个抽象基类,它不能被实例化,通常用于接口设计。 5. **覆盖与重载**:派生类可以重新定义基类的虚函数,这就是覆盖。而重载是指在同一个作用域中,用相同的函数名称但参数列表不同的函数,它们是完全...
抽象类是一种特殊的类,它不能被实例化,主要用来作为其他类的基类,提供一些通用的方法或属性。在C++中,我们通过包含至少一个纯虚函数(即只有声明没有实现的虚函数)来定义抽象类。这里的`Shape`类就是这样一个...
抽象类与抽象方法由abstract修饰 ...1.抽象类不能被实例化,只能被其他类继承 2.继承抽象类的子类必须把抽象类中的所有抽象成员都重写(实现)(除非子类也是抽象类。) 3.抽象类就是为了重写→多态。
例如,在公有继承中,派生类成员函数可以直接访问基类的公有和保护成员,但不能直接访问基类的私有成员。而通过派生类的对象,只能访问基类的公有成员。 #### 类用户的概念 在继承的背景下,类可以有三种不同类型...
final 关键字可以用来修饰类、方法和变量,表示它们不能被继承或修改。super 关键字可以用来访问父类的成员变量和方法。 本章主要讲解了 Java 中的继承和多态机制,包括继承的基本知识、父类和子类的关系、继承的...