C++中设计一个类,使其不能继承

1.c11中可以直接使用final关键字使得该类不能被继承

2.派生类用调用基类的构造函数来初始化基类部分,若将基类构造函数声明为private,则实例化派生类成员时链接出错,但是这样基类也不能实例化,编译出错

3.将一个类的构造函数声明为private,则该类及其子类都不能实例化,但是若把子类声明为该类的友元,则该子类可以调用基类的private成员函数,也就是说此时子类可以实例化,而且这时候子类的子类也可以初始化,因为子类的子类初始化基类部分是调用子类的构造函数,而子类是可以正常初始化的,所以想到虚继承,子类虚继承自父类,子类的子类正常继承自子类,此时子类和子类的子类共用一个指针,该指针指向基类部分。

class A
{
private:
    A(){}

    friend class B;
};

class B : virtual A
{
};

class C : public B
{
};

void main()
{
    B b;//ok
    C c;//false
}
时间: 2024-12-06 12:04:21

C++中设计一个类,使其不能继承的相关文章

Object-C的类可以多重继承吗?可以实现多个接口吗?category是什么?重写一个类的方式用继承好还是分类好,为什么?

答:Object-c的类不可以多重继承,可以实现多个接口(协议),Category是类别,重写一个类的方式一般用分类更好,仅仅对分类有效,不会影响到其他类与原有类的关系.category的主要作用是为已经存在的类添加方法.除此之外,apple官方还推荐了另外两种使用场景: 1.可以把类的实现分开在几个不同的文件,这样做有几个显而易见的好处:第一,可以减少单个文件的体积.第二,可以不同功能的组织放到不同的category中去.第三,可以由多个不同的开发者来共同完成一个类.第三,可以按需要来加载不同

类 (3) - 继承和多态

继承用来描绘现实情境中的is-a关系,即某物属于某种类别.c#不支持多重继承,但可以通过接口实现多重继承.通过继承,子类可以扩充父类的内容. 多态指的是根据类型的不同,相同的请求(相同的方法)可以做出不同的相应. C#实现多态最重要的方式就是接口.一个接口可能包括任意多个虚拟或者抽象方法,此时,继承了(实现了)该接口的类必须给出一个自己的实现(通过重写虚拟或者抽象方法).例如基类拥有虚拟方法speak,其没有实现,此时所有的派生类都要提供一个自己的实现,然后,对于任意的派生类,speak都对应着

条目四十:若一个类是函数子,使它可适配

<条目四十:若一个类是函数子,使它可适配> 在stl中,下面的函数适配器可以使函数指针转换为特定的类型,供下面的使用. 4个标准的函数配接器(not1.not2.bind1st和bind2nd)都要求一些特殊的类型定义,那些非标准的.与STL兼容的配接器通常也是如此. 但是如果是函数对象,那么需要继承基类函数适配器,实现特定的接口,使函数子拥有可适配的特性,这样才能更加健壮,适用范围更广. 如果函数子类的operator()只有一个实参,那么它应该从std::unary_function继承:

在VS2010中如何删除一个类(使之在Class View中不再出现)?

在 解决方案管资源管理器 中分别选择要删除的类的.h和.cpp文件,然后右键选择"移除",会弹出移除 删除 取消 三个选项,选择"移除",只是将类的文件从工程中删除,但文件还在工程的目录下保存着,选择"删除",就将文件从硬盘上删掉了 在VS2010中如何删除一个类(使之在Class View中不再出现)?,布布扣,bubuko.com

为什么java中只允许继承一个类?

一个类只能继承一个其他的类 在Java语言中禁止多重继承:一个类可以具有多个直接父类.多重继承不合法的原因是容易引发意义不明确.例如,有一个类C,如果允许它同时继承A类与B类(class C extends A,B{}),假如A.B两个类都有同一种方法fun(),如果定义: C c = new C(); 那么c.fun()应该调用哪一个父类的fun()方法?无法给出答案,因此Java语言禁止多重继承. 但C++却是可以的,所以C++比起java在语法上却难了些. 这一特性和上一特性结合使用,可以

Pycharm 查看一个类的继承关系图

Pycharm 查看一个类的继承关系图 在我们开发过程中: 无论是使用的开发框架自带的类, 还是我们自定义的类都特别多; 并且类之间单继承和多继承频繁使用, 这个继承,不仅仅是一级的继承关系,包括好几层的继承.父类的父类的父类. 直到最后->很难清楚一个类的实现关系, 迷失类的作用. 这里我们可以通过查看类的继承关系, 明白类的作用 查看DRF框架的APIView类的继承关系 下图就是我们查找的继承关系 查看DRF框架的GenericAPIView类所在.py模块的所有类继承关系 1.通过Ctr

python进阶四(类的继承)【4-1 python中继承一个类】

python中继承一个类 如果已经定义了Person类,需要定义新的Student和Teacher类时,可以直接从Person类继承: 1 class Person(object): 2 def __init__(self, name, gender): 3 self.name = name 4 self.gender = gender 定义Student类时,只需要把额外的属性加上,例如score: 1 class Student(Person): 2 def __init__(self, n

[.net 面向对象程序设计深入](1)UML——在Visual Studio 2013/2015中设计UML类图

[.net 面向对象程序设计深入](1)UML——在Visual Studio 2013/2015中设计UML类图 1.UML简介 Unified Modeling Language (UML)又称统一建模语言或标准建模语言. 简单说就是以图形方式表现模型,根据不同模型进行分类,在UML 2.0中有13种图,以下是他们的主要用途简介: 1.用例图:对系统的使用方式分类. 2.类图:显示类和它们的相互关系. 3.对象图:只显示对象及它们的相互关系. 4.活动图:显示人或对象的活动,其方式类似于流程

PHP类的封装与继承详解

封装 把成员方法和成员属性封装到类中,隐藏属性和方法实现的细节,通过public.protected.private等限定类成员的访问权限,数据被保护在内部,只通过被授权的成员方法才可以操作,尽可能的对成员进行封装. public:方法或者属性在任何作用域下都可以访问到,而且是默认的,如果没有为一个属性或方法指定访问修饰符,它将是public.protected:本类和子类可以访问,外部对象不可以调用.private:只能在本类访问,子类与外部对象都不可能调用.经过private标记的方法或者属