`

[C++][基础知识 3]虚基类

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

三 虚基类

    如图所示,如果类B和类C均由类A派生而成,而类D又是由类B和类C共同派生而成,则在派生类D中就出现了基类A的两个拷贝,从而产生了冲突。为了解决此问题,VC++中引入了虚基类的概念,即在由类A派生类B和类C时,如果将基类A说明为虚基类,则类A在此后的派生类中只生成一个拷贝。例如:

#include<iostream.h>
class A{
public:
	int a,b;
	A(int x){a=x;}
};
class B:virtual public A{  //A行
public:
	int b;
	B(int x,int y):A(y){b=x;}
};
class C:public virtual A{ //B行
public:
	int c;
	C(int x,int y):A(y){c=x;}
};
class D:public B,public C{
public:
	int d;
	D(int x,int y,int z,int q):B(y,z),C(z,q),A(q) //C行
	{d=x;}
};
void main()
{
	D d1(1,2,3,4);
	cout<<d1.a<<'\t'<<d1.b<<'\t'<<d1.c<<'\t'<<d1.d<<'\n';//A行
}

   虚基类的说明使用关键字virtual,其基本格式如下:
class <派生类名>:virtual <派生特性> <基类名>
{…}

其中关键字virtual可以放在“派生特性”前(如上面的A行),也可以放在“派生特性”后(如上面的B行)。
    由于类D的构造函数分别调用了类B和类C的构造函数,而类B和类C的构造函数又都分别调用了类A的构造函数,这样,在类D生成对象时就无法确定从类A中继承来的成员的初始值。VC++中规定,在这种情况下,在执行类B和类C的构造函数时均不调用类A的构造函数,而是由类D的构造函数来直接调用类A的构造函数。所以,如果类A没有缺省的构造函数,在类D的构造函数中必须明确类A的构造函数的调用。如果上面程序的C行中去掉最后的类A的构造函数调用A(q),即将C行改为如下形式:
    D(int x,int y,int z,int q):B(y,z),C(z,q)

则系统编译时将报错。上面的程序运行后输出:
4  3  2  1
    从程序的输出可以看出,类D中从类A继承来的成员a的初始化是由C行中的A(q)完成的。
分享到:
评论

相关推荐

    c++基础知识.zip

    C++是一种广泛使用的面向对象的编程语言,由Bjarne Stroustrup于1983年在C语言的基础上发展而来。C++不仅保留了C语言的效率和灵活性,还引入了面向对象编程的概念,如类、对象、继承、封装和多态等。这些概念是理解...

    C++基础知识讲义v2

    这份"C++基础知识讲义v2"是一份专为初学者和初级C++讲师设计的学习资料,涵盖了C++的基础概念和关键特性。 1. **编程入门**(c++基礎知識1編程入門.pps):这部分通常会介绍C++的历史、基本语法,如变量声明、数据...

    C++基础 知识 C++基础 知识

    本教程将深入探讨C++的基础知识,帮助初学者建立起坚实的编程基础。 C++源于C语言,但又超越了C,它引入了类、模板、命名空间、异常处理等概念,使得面向对象编程成为可能。在学习C++基础时,首先要理解的是它的...

    C++经典练习,从基本的到C++所有知识点

    本资料包是专为C++初学者和进阶者设计的一系列练习,旨在帮助你从基础到高级,全面理解和掌握C++的所有关键知识点。每个知识点都以独立的.doc文档形式呈现,便于学习和查阅。 一、运算符与表达式 C++中的运算符是...

    C++基础知识课件 PPT

    C++的基础知识包括以下几个核心部分: 1. **C++概述**: - **程序设计方法**:结构化程序设计和面向对象程序设计。结构化设计强调自顶向下、逐步求精,以函数为基本单元;面向对象设计则强调对象和消息传递,更...

    C++基础知识简单汇总_终稿106__tagged1

    C++基础知识汇总 C++是一种强大的、面向对象的编程语言,具有丰富的库支持和高度的灵活性。本汇总主要涵盖C++的基础概念、内存管理、面向对象特性、语法特性以及一些常见问题。 1. C++中的内存管理: - `new` 和 ...

    C++基础知识学习课件

    学习C++的基础知识,对于任何想要从事软件开发的人来说都是必要的。它不仅适用于系统级编程,也是游戏开发、嵌入式系统、桌面应用和大规模软件项目的重要选择。掌握C++的基础,不仅可以帮助理解其他高级编程语言,也...

    c++多态性与虚函数练习题

    ### C++多态性与虚函数知识点解析 #### 一、多态性的概念 多态性是面向对象编程的一个核心特性,它允许我们通过基类的接口来操作派生类的对象。这种特性使得代码更加灵活且易于扩展。在C++中,多态性主要通过虚函数...

    C++基础知识简单汇总_终稿1061

    以下是C++基础知识的一些关键点: 1. **面向对象特性**:C++的面向对象特性包括封装、继承和多态。封装允许将数据和操作这些数据的方法组合在类中,保护数据不受外部直接访问。继承允许创建一个类(子类)作为现有...

    c++基础知识

    C++是一种广泛使用的编程语言,尤其...《c++基础知识.chm》文件很可能包含了更详细的讲解,包括实例和练习,对深入学习大有裨益。对于初学者来说,坚持学习和实践,逐步积累经验,才能真正掌握C++这门强大的编程语言。

    c++j基础知识课件

    作为C++的基础知识,我们首先要理解它的历史背景。C++是由Bjarne Stroustrup在1979年基于C语言的基础上发展起来的,旨在提供一种面向对象的编程能力,同时保留C语言的效率。 1. **基础语法**:C++的基础语法与C语言...

    c++基础知识及面向对象课件

    在“c++基础知识及面向对象课件”中,我们可以深入学习C++的核心概念,包括类与对象、继承与派生、多态性等,这些都是C++面向对象编程的基础。 首先,第4章“类与对象”介绍了C++的核心概念。类是C++中的蓝图,用于...

    C++基础知识及典型编程实例

    本篇将深入探讨C++的基础知识以及一些典型的编程实例,帮助初学者快速上手。 在C++语言基础中,数据类型是编程的基石。其中,引用类型(References)是一种特殊的变量,它在声明时必须初始化,并且一旦赋值后就不可...

    c++程序设计 继承与派生实验(二)

    在这个“C++程序设计 继承与派生实验(二)”中,我们将深入探讨这三个关键知识点:类的派生与继承的概念、继承方式对成员访问权限的影响,以及虚基类的用法。 首先,让我们理解类的继承与派生。继承是面向对象设计...

    C++ 基础知识总结_终稿_1241

    C++ 是一种强大的、高效的编程语言,广泛应用于系统软件、应用程序、游戏开发、嵌入式系统等各个领域。...以上就是C++基础知识的一些核心要点,理解和掌握这些概念是深入学习C++并编写高效、可靠代码的基础。

    C++基础知识点内部讲义

    在C++编程语言中,有一些基础且重要的知识点,这些知识点在学习C++的过程中至关重要。以下是对给定文件中提到的一些关键点的详细解释: 1. **逗号运算符**: - 逗号运算符 `(,)` 具有低优先级,意味着它会在赋值...

    c++各个知识点的例子

    这本书深入浅出地介绍了C++的各种概念和技术,帮助读者建立起扎实的C++基础。 在学习C++时,以下几个核心知识点是非常关键的: 1. **基本语法与数据类型**:C++的基础包括变量、常量、运算符、控制结构(如if语句...

Global site tag (gtag.js) - Google Analytics