`

C++创建 可以实例化但不能继承的类

    博客分类:
  • C++
 
阅读更多

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++ 继承特性

    ——派生类需要自己的构造函数。  派生类中可以根据需要添加额外的数据成员和成员函数,甚至可以给予继承的原成员函数新的定义。... C++11增加了允许继承构造函数的机制,但派生类默认不能继承构造函数和析构

    C++基础实例详细教程

    C++既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计。 ...

    C++范例大全

     实例l:实现C++类的多重继承  实例2:使用虚函数实现运行时多态  实例3:使用操作符重载实现编译多态——复数的加法运算  实例4:使用函数模板实现不同数据类型的极值函数  1.2 C++常用的操作与算法  实例5...

    Visual C++ MFC编程实例

    内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚函数、模板和包容器...

    c++编程思想,c++实例编程

    内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚函数、模板和包容器...

    C++编程思想 例子和叙述讲解C++编程

    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 “库”使你...

    Visual C++实践与提高-COM和COM+篇『PDF』

    因文件超过20M不能上传,所以拆分为两个文件分次上传 第1章 COM背景知识 1.1 COM的起源 1.1.1 软件业面临的挑战 1.1.2 传统解决方案 1.1.3 面向对象程序设计方法 1.1.4 最终解决方案:组件软件 1.1.5 面向对象的...

    c.c++找工作面试重点结构图-mindmanager

    因此,继承的机制将使得在创建新类时,只需说明新类与已有类的区别,从而大量原有的程序代码都可以复用,所以有人称类是“可复用的软件构件”。 访问方式调整 控制方式 访问声明采用作用域"::" ,它的一般形式为:...

    C++编程思想习题

    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章 动态对象创建...

    现代C++程序设计

    1.2.1 C++程序并不一定是面向对象的 1.2.2 一个简单的面向对象程序示例 1.2.3 面向对象的软件更有优势 1.3 结构化设计与面向对象设计 1.3.1 ATM——结构化设计 1.3.2 采用面向对象方法的ATM——究竟是谁的任务 ...

    C++ Primer第四版【中文高清扫描版】.pdf

    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 ...

    VC++开发400实例

    实例001——实现C++类的多重继承 实例002——使用虚函数实现运行时多态 实例003——操作符重载实现编译多态(复数的加法运算) 实例004——使用函数模板实现不同数据类型的极值函数 实例005——使用C++实现格式...

    Visual C++范例大全(第一章)

    实例001——实现C++类的多重继承 实例002——使用虚函数实现运行时多态 实例003——操作符重载实现编译多态(复数的加法运算) 实例004——使用函数模板实现不同数据类型的极值函数 实例005——使用C++实现格式...

    《Visual C++ 范例大全》随书光盘 第一章

    实例001——实现C++类的多重继承 实例002——使用虚函数实现运行时多态 实例003——操作符重载实现编译多态(复数的加法运算) 实例004——使用函数模板实现不同数据类型的极值函数 实例005——使用C++实现格式...

    Visual C++ 2005入门经典.part08.rar (整理并添加所有书签)

    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 ...

    Visual C++ 2005入门经典.part04.rar (整理并添加所有书签)

    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 ...

    UIEnter.rar

    创建与实现圆类 1.编写“点”Point 这个类 ,包括属性:X坐标,Y坐标;方法:设置X坐标void setX(),Y坐标void setY(),返回X坐标int getX(),Y坐标int getY(),设置点的方法void setPoint(),显示点坐标void show...

    Visual C++ 2005入门经典.part05.rar (整理并添加所有书签)

    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 ...

Global site tag (gtag.js) - Google Analytics