`
agui2007
  • 浏览: 27705 次
  • 性别: Icon_minigender_1
  • 来自: 浙江
社区版块
存档分类
最新评论

C++的虚拟继承

阅读更多

C++的虚拟继承

virtual   public(或者 public virtual )语句声明了该基类为虚拟基类,
即在多重继承时所有派生类共享一个基类!这样避免了每个派生类都执行基类的构造函数,产生多个基类的副本!这样做的好处可以避免产生二义性等。

下面的例子是百度来的!!

#include <iostream>
using namespace std;
class A {
	protected:
		int a;
	public: 	
		A()
		{ 	
			a = 5;
			cout<<a<<endl;
		}
};
class B : virtual public A 
{
	public:
		B()
		{	
			a += 10;
			cout<<a<<endl;
		}
};
class C : public virtual  A  //public virtual 和virtual public 效果相同
{
	public:
		C()
		{
			a += 20;
			cout<<a<<endl;
		}
};
class D :public B, public C
{
	public:
		D()
		{
			a += 30;
			cout<<a<<endl;
		}
};
int main()
{	
	D d;
	return 0;
}

 

它的输出结果是:

A=5
B=15
C=35
D=65

如果在B类和C类继承A类时,去掉virtual,那么编译器就会报错:(我是用g++编译的)

her.cpp: In constructor ‘D::D()’:
her.cpp:36: error: reference to ‘a’ is ambiguous
her.cpp:5: error: candidates are: int A::a
her.cpp:5: error: int A::a
...

 

 


分享到:
评论

相关推荐

    C++虚拟继承举例及其代码

    在C++编程语言中,虚拟继承(Virtual Inheritance)是一种特殊的继承方式,它解决了一类称为“菱形问题”或多继承中的二义性问题。在本篇内容中,我们将深入探讨虚拟继承的概念、作用以及如何在实践中应用。通过一个...

    C++虚拟多重继承对象模型讨论-样例

    这种继承方式的主要目的是解决“菱形问题”(Diamond Problem),即在非虚拟继承的多重继承中,派生类可能会有多于一份基类子对象,导致二义性。本篇讨论将深入探讨虚拟多重继承的对象模型,以及如何通过样例程序来...

    C++的虚拟继承机制

    比如:虚函数必须要通过一种间接的运行时(而不是编译时)机制才能够激活(调用)的函数,而虚继承也是必须在运行时才能够进行定位访问的一种体制。存在,但间接。其中关键在于存在、间接和共享这三种特征。

    C++ 虚继承对基类构造函数调用顺序的影响

    可见性继承比较简单,而虚拟继承对学习c++的难度较大。  首先,虚拟继承与普通继承的区别有:  假设derived 继承自base类,那么derived与base是一种“is a”的关系,即derived类是base类,而反之错误;  ...

    C++ 内存布局虚继承 ---Empty virtual base classs (空虚基类)

    C++ 中的虚拟继承是一种特殊的继承机制,它允许一个派生类从多个基类继承,而不产生钻石继承问题。虚拟继承的实现方式是在编译器的实现中,并且不同的编译器厂商可能采用不同的实现方法。下面我们将深入分析 C++ ...

    C++多继承Demo

    在C++编程语言中,多继承是一种特性,允许一个派生类从多个基类继承属性和行为。这个特性使得代码重用更为灵活,但同时也带来了潜在的问题,如菱形问题和二义性。本示例"**C++多继承Demo**"通过包含源代码文档...

    C++多继承的详解教程

    1. **基本方案**:阐述多继承的基础方案,解决歧义的基本策略,以及虚拟函数的实现方式。 2. **处理同一继承格子中多次包含的类**:讨论当一个类在继承格子中被多次引用时如何处理。程序员可以选择是否为重复包含的...

    c++ 实现虚拟文件系统

    根据给定的信息,我们可以推断出作者正在尝试使用C++实现一个简单的虚拟文件系统。下面将详细介绍该虚拟文件系统的组成部分及其工作原理。 ### 一、虚拟文件系统结构 #### 1. `diskIniTop` 结构体 这个结构体包含...

    关于C++中虚拟继承的一些总结分析

    1.为什么要引入虚拟继承虚拟继承是多重继承中特有的概念。...虚拟继承在一般的应用中很少用到,所以也往往被忽视,这也主要是因为在C++中,多重继承是不推荐的,也并不常用,而一旦离开了多重继承,虚拟继承就完

    实现c++类的多重继承的例程

    虚拟继承确保了多继承路径上的基类只被继承一次,从而避免了二义性。 在实际编程中,多重继承应当谨慎使用,因为它可能导致复杂性增加和代码维护困难。然而,在某些特定场景下,如接口实现或组合多个功能组件,多重...

    Java的interface观念与C++多重继承比较

    因为C++的虚拟函数可以有纯虚拟函数,也可有非纯虚拟函数,而Java只有抽象函数,所以功能模式少一种,自然能达到的效果较少一些。 但这并不代表Java的interface就比较差,因为interface的观念较简单,全部动态的抽象...

    讲解C++多继承

    然而,虚拟继承也有其代价,包括额外的内存开销和更复杂的构造函数调用顺序。 总的来说,多继承在C++中是一个强大的工具,可以用于构建复杂而灵活的类层次结构。然而,它也带来了二义性和菱形问题等挑战,需要谨慎...

    C++虚拟数字键盘 源代码 可扩展

    总的来说,这个C++虚拟数字键盘的源代码提供了一个很好的学习平台,涵盖了面向对象编程、事件驱动编程、GUI设计、错误处理等多个关键知识点。开发者不仅可以借此了解C++的基本语法和编程技巧,还可以深入探究如何...

    C++面向对象技术完全剖析_源代码(继承,封装,多态,虚函数,纯虚函数,虚拟继承,多重继承,函数重载,指针……)

    3、体现继承 虚拟继承(要通过至少三层 父类父类子类) 虚函数 (3层 纵向关系) 水平方向上:体现出继承顺序 先虚拟继承 再普通继承 通过实例化类 体现对象构造和析构的顺序 还要有函数重载 指针 指针悬挂 无参...

    C++ 多重继承和虚拟继承对象模型、效率分析

    C++的多重继承和虚拟继承是面向对象编程中两种高级特性,它们允许类从多个基类继承特性,但同时也引入了复杂性和效率问题。本文主要探讨了这两种继承方式的基本概念,对象模型的差异,以及它们对运行效率的影响。 ...

    多重继承(6_7钻石继承问题)_C++_

    为了解决这个问题,C++引入了**虚拟继承(virtual inheritance)**的概念。在声明基类时,我们可以使用`virtual`关键字,比如`class B : virtual public A`,这样B就虚拟地继承了A。虚拟继承确保所有通过虚拟基类...

    从汇编看c++的虚拟继承以及其内存布局

    在C++中,虚拟继承(virtual inheritance)是一种解决多重继承中“菱形问题”的机制,它确保了子类中只有一个共享基类实例。这个特性在内存布局和对象构造上都有特殊的影响。我们来深入理解一下这个概念。 首先,让...

    C++继承与多态课件

    根据继承的方式,派生可以分为三种类型:单一继承(从一个基类派生),多重继承(从多个基类派生)和虚拟继承(在多重继承中解决二义性问题)。派生类不仅可以继承基类的公有和保护成员,还可以添加新的成员或者重...

    24.C++解决重复继承的问题1

    在C++编程语言中,重复继承是指一个派生类从两个或多个基类中继承,而这些基类可能有一个共同的祖先。这种情况下,如果共同祖先(基类)中存在同名成员,编译器就会遇到二义性问题,因为不知道应该使用哪个基类中的...

Global site tag (gtag.js) - Google Analytics