继承

c++设计一个不能被继承的类,为什么必须是虚继承?原因分析

房东的猫 提交于 2019-12-10 17:55:13
用C++实现一个不能被继承的类(例1) #include <iostream> using namespace std; template <typename T> class Base{ friend T; private: Base(){ cout << "base" << endl; } ~Base(){} }; class B:virtual public Base<B>{ //一定注意 必须是虚继承 public: B(){ cout << "B" << endl; } }; class C:public B{ public: C(){} //继承时报错,无法通过编译 }; int main(){ B b; //B类无法被继承 //C c; return 0; } 类Base的构造函数和析构函数因为是私有的,只有Base类的友元可以访问,B类在继承时将模板的参数设置为了B类,所以构造B类对象时们可以直接访问父类(Base)的构造函数。 为什么必须是虚继承(virtual)呢? 参见 c++Primer 4th 第17.3.7节 特殊的初始化语义 通常每个类只初始化自己的直接基类,但是在虚继承的时候这个情况发生了变化,可能导致虚基类被多次初始化,这显然不是我们想要的。(例2: AA,AB都是类A的派生类,然后类C又继承自AA和AB,如果按之前的方法会导致C里面A被初始化两次

scala入门-07特质类(trait)的使用

霸气de小男生 提交于 2019-12-10 05:07:36
trait类似于Java8中的可用带default method的接口。 trait中可以带有实现的方法,也可以带有抽象方法,使用trait的方法是with而混入类中。 我们在scala下的org.scala.clazz下创建一个类MyTrait.scala 定义一个特质类 Logger 定义MyLogger类 实现特质类Logger 调用: PS:我们这里使用trait是使用extends,这是因为MyLogger没有继承其他类火灾trait 子trait可以覆盖实现父traitd的方法: 调用: 如果子trait在如果覆盖父trait中已经实现的方法必须使用override关键字: 定义抽象类Account和class MyAccont 调用: 这是demo属于在一个对象中混入trait 来源: oschina 链接: https://my.oschina.net/u/230960/blog/366652

JavaScript和Lua的类继承

别说谁变了你拦得住时间么 提交于 2019-12-09 11:08:25
javascript 本身虽是一门面向对象的编程语言, 但并没有明确提供继承方式.二十多年间,众多高手提供很多模拟继承的实现, 主要的有:对象冒充,call/apply,prototype,以及深复制等. 网上有很多此类教程,在这里就不再赘述这些实现.我所在的团队正在做的项目,需要使用js和lua实现同一份API接口,已达到js和lua的无缝切换.所以,实现类的继承方案至关重要. 接下来,就是具体实现过程, 如有不到之处,还望大家指正. Lua ,是一门很优秀的动态语言,为嵌入而生,如果只是当成脚本使用的话,类的概念其实并不必要, 但是如果想要构成庞大规模的代码量,这就一个亟待的问题, 因为Lua 的操作符重载的支持, 使得这一过程得以实现. javascript: function Class(Super, init ){ //do } lua : function Class(Super , init ) --[[do]] end *Super , 是新生成的类需要继承的父类. *init , 是新生成的类的构造函数. 下面, 我们就来实现这个两个Class函数. 1.在js当中,调用new算符实际就是复制当前构造函数原型.因为Lua中并没有new算符,所以应该将其屏蔽. 2.在lua中想要实现方法的关联,主要使用两种方案, 一是复制,二是覆盖元表__index索引

Maven pom 继承聚合

醉酒当歌 提交于 2019-12-07 19:59:06
1.1.0 简介 对于一个pom.xml来说有几个元素是必须定义的,一个是project根元素,然后就是它里面的modelVersion、groupId、artifactId和version。由上面的超级pom.xml的内容我们可以看到pom.xml中没有groupId、artifactId和version的定义,所以我们在建立自己的pom.xml的时候就需要定义这三个元素。和java里面的继承类似,子pom.xml会完全继承父pom.xml中所有的元素,而且对于相同的元素,一般子pom.xml中的会覆盖父pom.xml中的元素,但是有几个特殊的元素它们会进行合并而不是覆盖。这些特殊的元素是: dependencies,developers, contributors, plugin列表(包括plugin下面的reports), resources 1.1.1继承 1.1.1.1 被继承项目与继承项目是父子目录关系 现在假设我们有一个项目projectA,它的pom.xml定义如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org

Scala的Self-Type

半腔热情 提交于 2019-12-06 16:04:25
起因 今天看了一个Scala写的项目,里面看到有一段这样的代码: trait BaseController extends BSONImplicits with JSONImplicits with StrictLogging { this: Controller => ...... } 然后通过看Scala Language Specification,知道这个语法叫做SelfType的。 作用 这里面我们可以看到BaseController是扩展的BSONImplicits,但是BSONImplicits的基础类并非Controller,所以通过这个语法让Scala将这个trait认为是Conroller类。并且BaseController可以使用Controller类的所有方法和变量。 可以看出SelfType语法类相当于继承,并且更灵活些。 更多用途我们可以参考 http://docs.scala-lang.org/tutorials/tour/explicitly-typed-self-references.html 。 来源: oschina 链接: https://my.oschina.net/u/236698/blog/543514

PostgreSQL从继承到分区(一)

孤街浪徒 提交于 2019-12-06 02:57:55
PostgreSQL从继承到分区 (pg_partman) PostgreSQL从继承到分区(一) http://my.oschina.net/lianshunke/blog/205296 PostgreSQL从继承到分区(二) http://my.oschina.net/lianshunke/blog/205296 PostgreSQL从继承到分区(三) http://my.oschina.net/lianshunke/blog/205316 一、Inheritance http://www.postgresql.org/docs/9.3/static/ddl-inherit.html 通过下面的简单例子说明什么是表继承: 1.1 单表继承 postgres=# CREATE DATABASE lsk; CREATE DATABASE postgres=# \c lsk You are now connected to database "lsk" as user "postgres". lsk=# CREATE TABLE t1(id int,name varchar(20)); CREATE TABLE lsk=# CREATE TABLE t2(age int) inherits(t1); CREATE TABLE {在子表中新添的字段会汇同父表的所有字段一起作为子表字段}

PostgreSQL从继承到分区(三)

天涯浪子 提交于 2019-12-05 06:54:10
三、Pg_partman 3.1 介绍 pg_partman是基于PostgreSQL分区开发的一个分区表管理工具,通过多个引入函数实现了对分区表的管理,相比手工创建分区表、触发器函数、触发器显得更加快捷方便,同时提供了对分区表的日常维护与管理功能。 其实现原理是将约束、函数、触发器、分区表的创建以及基础管理命令均写入函数,通过函数的调用即可方便创建与维护,并且避免了手工创建引入错误。 3.2 安装 下载地址: https://github.com/keithf4/pg_partman 编译安装: [postgres@localhost ~]$ cd pg_partman-master [postgres@localhost pg_partman-master]$ make [postgres@localhost pg_partman-master]$ make install 创建partman使用的空间: postgres=# create schema partman; CREATE SCHEMA 引入扩展模块pg_partman: postgres=# create extension pg_partman with schema partman ; CREATE EXTENSION postgres=# \dx List of installed extensions

Java自学-接口与继承 多态

易管家 提交于 2019-12-02 23:00:33
Java的多态 操作符的多态 +可以作为算数运算,也可以作为字符串连接 类的多态 父类引用指向子类对象 示例 1 : 操作符的多态 同一个操作符在不同情境下,具备不同的作用 如果+号两侧都是整型,那么+代表 数字相加 如果+号两侧,任意一个是字符串,那么+代表字符串连接 package charactor; public class Hero { public String name; protected float hp; public static void main(String[] args) { int i = 5; int j = 6; int k = i+j; //如果+号两侧都是整型,那么+代表 数字相加 System.out.println(k); int a = 5; String b = "5"; String c = a+b; //如果+号两侧,任意一个是字符串,那么+代表字符串连接 System.out.println(c); } } 示例 2 : 观察类的多态现象 观察类的多态现象: i1和i2都是Item类型 都调用effect方法 输出不同的结果 多态: 都是同一个类型,调用同一个方法,却能呈现不同的状态 package property; public class Item { String name; int price; public void

c++ name hiding, overriding, overloading

淺唱寂寞╮ 提交于 2019-12-02 16:48:09
c++ name hiding overloading overriding overriding : The redefinition of a virtual function in a sedprived class is usually called overriding. overloading :重载 redefine : <!-- lang: cpp --> 在此输入代码 #include <iostream> #include <string> using namespace std; class base { public: int f() const{ cout << "base::f()" << endl; return 1; } int f(string) const{ cout << "base::f(string)" <<endl; return 1; } void g(){cout << "base::g()"<<endl;} }; class derived1 : public base { public: void g() const{cout << "derived1::g()" <<endl;} }; class derived2 : public base { public: int f() const{ cout << "derived2:

面向对象的基本特征

只愿长相守 提交于 2019-12-01 04:34:56
面向对象方法具有三个基本特征: 封装:封装是将对象的实现细节隐藏起来,然后通过一些公共的方法来暴露该对象的功能。 继承:继承是面向对象实现软件复用的重要手段,当子类继承父类后,子类作为一种特殊的父类,将直接获得父类的属性和方法; 多态:多态讲的是子类对象可以直接赋给父类变量,但运行的时候依然表现出子类的行为特征,这意味着同一个类的对象在执行同一个方法时,可能表现出多种行为特征。 对面向对象的理解 ### 封装 类的封装是指类把所有的操作都封闭起来,仅仅提供接口出来让其他人使用,使用的人没有必要懂得类里面的操作,只需要懂得操作接口就可以了。比如开汽车,我们只需要懂得方向盘、刹车、油门等等的使用就可以了,没有必要知道刹车是如何构成的封闭好的操作。同时,封装也提高了程序的可替换性。比如两个汽车公司实现刹车的方式不一样,但是,只要我们学会了使用刹车,那么,开两个汽车公司的车就都没有问题了,我们不需要考虑他们怎样实现刹车这门技术的。 ### 继承 类的继承性是指从已有的一个类来extends子类,子类具有了父类的所有特征,同时,子类也可以有新的特性。比如:人是一个类,男人具有了人类的所有的特性,比如思考,比如劳动。同时,男人也有新的特性,比如男人会长胡子。 ### 多态 类的多态性是一个对象的某项功能可以处理不同类型的问题,或者一个子类可以将父类的某个功能替换成新的功能