class vb{
private:
vb(){}
friend C;
}
//vb这个是一个基类,它的构造函数是private,因此它根本就无法被创建。但是我们显式增加了一个friend C。因此只有C才能创建vb。这是关键点。
class C:virtual public vb{
};
//C虚拟继承自vb,这样在构造C的时侯,需要调用vb的默认构造函数,虽然vb的构造函数是private的,但是由于C是vb的friend,因此我们可以自由的在栈上,堆上建立C的实例。例如:
C c;
C *pc = new C;
都没有问题。
但是下面我们会看到,C已经成了一个final class,它无法在被任何其他class继承。
例如:
class D : public C //编译错误
D尝试继承自C,C又虚拟继承了vb,虚拟继承的一个特性是,被虚拟继承的基类(指vb)总是在派生层次最深的类(指D)中构造,因此D需要访问vb的构造函数才能将自己建立起来。由于vb的构造函数是private,而且仅仅指定了唯一的一个friend C,因此D是无权访问vb::vb(),也就根本无法通过编译。
这样,C也成为了一个无法被继承的类。vb和虚拟继承是它的一个实现手法。
#include <iostream>
using namespace std;
class va
{
friend class vb;
private:
va(){}
~va(){}
};
class vb:public virtual va{};
class vc:public vb {};
int main()
{
vc a;//实例化才报错,虚拟集成会跳过vb的构造函数,去执行va的,但是vc不是va的友元
}
相关推荐
——派生类需要自己的构造函数。 派生类中可以根据需要添加额外的数据成员和成员函数,甚至可以给予继承的原成员函数新的定义。... C++11增加了允许继承构造函数的机制,但派生类默认不能继承构造函数和析构
C++既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计。 ...
实例l:实现C++类的多重继承 实例2:使用虚函数实现运行时多态 实例3:使用操作符重载实现编译多态——复数的加法运算 实例4:使用函数模板实现不同数据类型的极值函数 1.2 C++常用的操作与算法 实例5...
内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚函数、模板和包容器...
内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚函数、模板和包容器...
1.1.2 继承:类型关系 1 1.1.3 多态性 2 1.1.4 操作概念:OOP程序像什么 3 1.2 为什么C++会成功 3 1.2.1 较好的C 3 1.2.2 采用渐进的学习方式 4 1.2.3 运行效率 4 1.2.4 系统更容易表达和理解 4 1.2.5 “库”使你...
因文件超过20M不能上传,所以拆分为两个文件分次上传 第1章 COM背景知识 1.1 COM的起源 1.1.1 软件业面临的挑战 1.1.2 传统解决方案 1.1.3 面向对象程序设计方法 1.1.4 最终解决方案:组件软件 1.1.5 面向对象的...
因此,继承的机制将使得在创建新类时,只需说明新类与已有类的区别,从而大量原有的程序代码都可以复用,所以有人称类是“可复用的软件构件”。 访问方式调整 控制方式 访问声明采用作用域"::" ,它的一般形式为:...
11.3.5不能重载的运算符 11.4非成员运算符 11.5重载赋值符 11.6自动类型转换 11.6.1构造函数转换 11.6.2运算符转换 11.6.3一个理想的例子:strings 11.6.4自动类型转换的缺陷 11.7小结 11.8练习 第12章 动态对象创建...
1.2.1 C++程序并不一定是面向对象的 1.2.2 一个简单的面向对象程序示例 1.2.3 面向对象的软件更有优势 1.3 结构化设计与面向对象设计 1.3.1 ATM——结构化设计 1.3.2 采用面向对象方法的ATM——究竟是谁的任务 ...
16.2 实例化 535 16.2.1 模板实参推断 537 16.2.2 函数模板的显式实参 540 16.3 模板编译模型 542 16.4 类模板成员 545 16.4.1 类模板成员函数 548 16.4.2 非类型形参的模板实参 551 16.4.3 类模板中的友元声明 552 ...
实例001——实现C++类的多重继承 实例002——使用虚函数实现运行时多态 实例003——操作符重载实现编译多态(复数的加法运算) 实例004——使用函数模板实现不同数据类型的极值函数 实例005——使用C++实现格式...
实例001——实现C++类的多重继承 实例002——使用虚函数实现运行时多态 实例003——操作符重载实现编译多态(复数的加法运算) 实例004——使用函数模板实现不同数据类型的极值函数 实例005——使用C++实现格式...
实例001——实现C++类的多重继承 实例002——使用虚函数实现运行时多态 实例003——操作符重载实现编译多态(复数的加法运算) 实例004——使用函数模板实现不同数据类型的极值函数 实例005——使用C++实现格式...
9.9.1 C++/CLI类的继承 9.9.2 接口类 9.9.3 定义接口类 9.9.4 类和程序集 9.9.5 被指定为new的函数 9.9.6 委托和事件 9.9.7 引用类的析构函数和结束函数 9.9.8 通用类 9.10 小结 9.11 练习 第10章 调试技术 10.1 ...
9.9.1 C++/CLI类的继承 9.9.2 接口类 9.9.3 定义接口类 9.9.4 类和程序集 9.9.5 被指定为new的函数 9.9.6 委托和事件 9.9.7 引用类的析构函数和结束函数 9.9.8 通用类 9.10 小结 9.11 练习 第10章 调试技术 10.1 ...
创建与实现圆类 1.编写“点”Point 这个类 ,包括属性:X坐标,Y坐标;方法:设置X坐标void setX(),Y坐标void setY(),返回X坐标int getX(),Y坐标int getY(),设置点的方法void setPoint(),显示点坐标void show...
9.9.1 C++/CLI类的继承 9.9.2 接口类 9.9.3 定义接口类 9.9.4 类和程序集 9.9.5 被指定为new的函数 9.9.6 委托和事件 9.9.7 引用类的析构函数和结束函数 9.9.8 通用类 9.10 小结 9.11 练习 第10章 调试技术 10.1 ...