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++编程语言中,虚拟继承(Virtual Inheritance)是一种特殊的继承方式,它解决了一类称为“菱形问题”或多继承中的二义性问题。在本篇内容中,我们将深入探讨虚拟继承的概念、作用以及如何在实践中应用。通过一个...
这种继承方式的主要目的是解决“菱形问题”(Diamond Problem),即在非虚拟继承的多重继承中,派生类可能会有多于一份基类子对象,导致二义性。本篇讨论将深入探讨虚拟多重继承的对象模型,以及如何通过样例程序来...
比如:虚函数必须要通过一种间接的运行时(而不是编译时)机制才能够激活(调用)的函数,而虚继承也是必须在运行时才能够进行定位访问的一种体制。存在,但间接。其中关键在于存在、间接和共享这三种特征。
可见性继承比较简单,而虚拟继承对学习c++的难度较大。 首先,虚拟继承与普通继承的区别有: 假设derived 继承自base类,那么derived与base是一种“is a”的关系,即derived类是base类,而反之错误; ...
C++ 中的虚拟继承是一种特殊的继承机制,它允许一个派生类从多个基类继承,而不产生钻石继承问题。虚拟继承的实现方式是在编译器的实现中,并且不同的编译器厂商可能采用不同的实现方法。下面我们将深入分析 C++ ...
在C++编程语言中,多继承是一种特性,允许一个派生类从多个基类继承属性和行为。这个特性使得代码重用更为灵活,但同时也带来了潜在的问题,如菱形问题和二义性。本示例"**C++多继承Demo**"通过包含源代码文档...
1. **基本方案**:阐述多继承的基础方案,解决歧义的基本策略,以及虚拟函数的实现方式。 2. **处理同一继承格子中多次包含的类**:讨论当一个类在继承格子中被多次引用时如何处理。程序员可以选择是否为重复包含的...
根据给定的信息,我们可以推断出作者正在尝试使用C++实现一个简单的虚拟文件系统。下面将详细介绍该虚拟文件系统的组成部分及其工作原理。 ### 一、虚拟文件系统结构 #### 1. `diskIniTop` 结构体 这个结构体包含...
1.为什么要引入虚拟继承虚拟继承是多重继承中特有的概念。...虚拟继承在一般的应用中很少用到,所以也往往被忽视,这也主要是因为在C++中,多重继承是不推荐的,也并不常用,而一旦离开了多重继承,虚拟继承就完
虚拟继承确保了多继承路径上的基类只被继承一次,从而避免了二义性。 在实际编程中,多重继承应当谨慎使用,因为它可能导致复杂性增加和代码维护困难。然而,在某些特定场景下,如接口实现或组合多个功能组件,多重...
因为C++的虚拟函数可以有纯虚拟函数,也可有非纯虚拟函数,而Java只有抽象函数,所以功能模式少一种,自然能达到的效果较少一些。 但这并不代表Java的interface就比较差,因为interface的观念较简单,全部动态的抽象...
然而,虚拟继承也有其代价,包括额外的内存开销和更复杂的构造函数调用顺序。 总的来说,多继承在C++中是一个强大的工具,可以用于构建复杂而灵活的类层次结构。然而,它也带来了二义性和菱形问题等挑战,需要谨慎...
总的来说,这个C++虚拟数字键盘的源代码提供了一个很好的学习平台,涵盖了面向对象编程、事件驱动编程、GUI设计、错误处理等多个关键知识点。开发者不仅可以借此了解C++的基本语法和编程技巧,还可以深入探究如何...
3、体现继承 虚拟继承(要通过至少三层 父类父类子类) 虚函数 (3层 纵向关系) 水平方向上:体现出继承顺序 先虚拟继承 再普通继承 通过实例化类 体现对象构造和析构的顺序 还要有函数重载 指针 指针悬挂 无参...
C++的多重继承和虚拟继承是面向对象编程中两种高级特性,它们允许类从多个基类继承特性,但同时也引入了复杂性和效率问题。本文主要探讨了这两种继承方式的基本概念,对象模型的差异,以及它们对运行效率的影响。 ...
为了解决这个问题,C++引入了**虚拟继承(virtual inheritance)**的概念。在声明基类时,我们可以使用`virtual`关键字,比如`class B : virtual public A`,这样B就虚拟地继承了A。虚拟继承确保所有通过虚拟基类...
在C++中,虚拟继承(virtual inheritance)是一种解决多重继承中“菱形问题”的机制,它确保了子类中只有一个共享基类实例。这个特性在内存布局和对象构造上都有特殊的影响。我们来深入理解一下这个概念。 首先,让...
根据继承的方式,派生可以分为三种类型:单一继承(从一个基类派生),多重继承(从多个基类派生)和虚拟继承(在多重继承中解决二义性问题)。派生类不仅可以继承基类的公有和保护成员,还可以添加新的成员或者重...
在C++编程语言中,重复继承是指一个派生类从两个或多个基类中继承,而这些基类可能有一个共同的祖先。这种情况下,如果共同祖先(基类)中存在同名成员,编译器就会遇到二义性问题,因为不知道应该使用哪个基类中的...