C++模拟Java“内部”类
代码思路来自Thinking in C++ 10.13.1内部类方法。类似多重继承,但是类型转换是单向的:Outer支持“向上”转型,但是不能“向下”转型回Outer。
#include <iostream>
#include <string> using namespace std; class Interface1
{
public:
virtual void function1() = ;
}; void CallInterface1(Interface1& if1)
{
if1.function1();
} class Interface2
{
public:
virtual void function2() = ;
}; void CallInterface2(Interface2& if2)
{
if2.function2();
} // Multiple Inheritance
class Derived : public Interface1,
public Interface2
{
public:
Derived(const string& nm) : name(nm) {}
virtual void function1()
{
cout << "Call " << name << "'s " << __func__ << endl;
}
virtual void function2()
{
cout << "Call " << name << "'s " << __func__ << endl;
}
private:
string name;
}; // Mock Inner Class
class Outer {
public:
Outer(const string& nm) : name(nm), inner1(this), inner2(this) {}
operator Interface1&() {return inner1;}
operator Interface2&() {return inner2;}
private:
string name;
class Inner1;
friend class Outer::Inner1;
class Inner1 : public Interface1
{
public:
Inner1(Outer* p) : parent(p) {}
virtual void function1()
{
cout << "Call " << parent->name << "'s function1" << endl;
}
private:
Outer* parent;
} inner1;
class Inner2;
friend class Outer::Inner2;
class Inner2 : public Interface2
{
public:
Inner2(Outer* p) : parent(p) {}
virtual void function2()
{
cout << "Call " << parent->name << "'s function2" << endl;
}
private:
Outer* parent;
} inner2;
}; int main() {
Derived d("Derived Class");
CallInterface1(d);
CallInterface2(d); Outer o("Outer Class");
CallInterface1(o);
CallInterface2(o);
return ;
}
使用聚合代替继承,时间空间的折衷。
C++模拟Java“内部”类的更多相关文章
- java -> 异常类与自定义异常
异常 什么是异常?Java代码在运行时期发生的问题就是异常. 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 异常的继承体 ...
- Java常用类学习笔记总结
Java常用类 java.lang.String类的使用 1.概述 String:字符串,使用一对""引起来表示. 1.String声明为final的,不可被继承 2.String ...
- Java常用类的使用
Java常用类 1. Optional 在我们的开发中,NullPointerException可谓是随时随处可见,为了避免空指针异常,我们常常需要进行 一 些防御式的检查,所以在代码中常常可见if( ...
- Java:类与继承
Java:类与继承 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础.抽象.封装.继承.多态这四大特性都离不开类,只有存在类,才能体现面向对象编程的特点,今天我们就来了解一些类与继承的相关知 ...
- 模拟java.util.Collection一些简单的用法
/* 需求:模拟java.util.Collection一些简单的用法! 注意:java虚拟机中并没有泛型类型的对象.泛型是通过编译器执行一个被称为类型擦除的前段转换来实现的. 1)用泛型的原生类型替 ...
- 漫谈 Java 实例化类
Java 中实例化类的动作,你是否还是一成不变 new 对应对象呢? 经手的项目多了,代码编写量自然会增加,渐渐的会对设计模式产生感觉. 怎样使书写出来的类实例化动作,高内聚,低耦合,又兼具一定的扩展 ...
- 深入理解java虚拟机【Java Class类文件结构】
Java语言从诞生之时就宣称一次编写,到处运行的跨平台特性,其实现原理是源码文件并没有直接编译成机器指令,而是编译成Java虚拟机可以识别和运行的字节码文件(Class类文件,*.class),字节码 ...
- Java基础详解 (一)Java的类成员访问权限修饰词(以及类访问权限)
在一个类的内部,其成员(包括成员变量和成员函数)能否被其他类所访问,取决于该成员的修饰词.Java的类成员访问权限修饰词有四类:private,无(默认情况下),protected和public.其权 ...
- java Timer类
java.util 类 Timer java.lang.Object java.util.Timer public class Timerextends Object 一种工具,线程用其安排以后在后台 ...
随机推荐
- JS初识(着重讲解Date函数)
查看类型:typeof() 转换为int类型:parseInt() isNaN() 函数用于检查其参数是否是非数字值. NaN,是Not a Number的缩写.一种计算机用语.NaN 用于处理计算中 ...
- msyql数据库主从架构
在Web应用系统中,数据库性能是导致系统性能瓶颈最主要的原因之一.尤其是在大规模系统中,数据库集群已经成为必备的配置之一.集群的好处主要有:查询负载.数据库复制备份等. MySQL数据库支持数据库的主 ...
- .java 文件中只能定义一个public class 且与文件名相同
- SpringMVC+JPA使用注入的方式环境搭建
----------------------------------------------------DAO--------------------------------------------- ...
- 实现jsp网页设为首页功能
var url = location.href; var browser_name = navigator.userAgent; if(browser_name.indexOf('Chrome')!= ...
- JOIN 相关内容
1.left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 2.right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录 3.inner join ...
- CString 转 char*; wstring 转 string
1. CString 转 char* ); CString name; name.Format(_T("bookUC%d.txt"),m_ID); std::wstring _n ...
- Flex 拾色器改变背景
package { import flash.display.*; import flash.geom.*; import flash.utils.*; import mx.core.EdgeMe ...
- chrome 41 空格
chrome 41对半角空格的解析 当做一个汉字宽度来处理了. 导致很多网站出现异常. 目前能想到的方法是删掉用来规范格式的空格. 老版chrome chrome41 和讯网也有这种问题 有更好的处理 ...
- wpf随笔
因项目需要查找wpf.DataGrid的Binding方法, 由于其属于Dev框架体系内,偏向于winform并无Binding 1.且线程外更改UI控件还需要委托或者action,而Wpf控件仅需要 ...