C++虚基类的初始化

 1 #include<iostream>
 2 using namespace std;
 3 class Base{
 4     public:
 5         Base(int sa)
 6         {
 7             a=sa;
 8             cout<<"Constructing Base"<<endl;
 9         }
10     private://私有变量,不可在派生类中直接使用
11         int a;
12 };
13 class Base1:virtual public Base{
14     public:
15         Base1(int sa,int sb):Base (sa)
16         {
17             b=sb;
18             cout<<"Constructing Base1"<<endl;
19         }
20     private:
21         int b;
22 };
23 class Base2:virtual public Base{
24     public:
25         Base2(int sa,int sc):Base(sa)
26         {
27             c=sc;
28             cout<<"Constructing Base2"<<endl;
29         }
30     private:
31         int c;
32 };
33 class Derived:public Base1,public Base2{
34     public:
35         Derived(int sa,int sb,int sc,int sd)
36         :Base(sa),Base1(sa,sb),Base2(sa,sc)
37         //如果Base类不是虚基类,就不能使用这种方式调用基类的构造函数
38         {
39             d=sd;
40             cout<<"Constructing Derived"<<endl;
41         }
42     private:
43         int d;
44 };
45 int main()
46 {
47     Derived obj(2,4,6,8);
48     return 0;
49 }
50
51 /*
52 执行结果
53 Constructing Base
54 Constructing Base1
55 Constructing Base2
56 Constructing Derived
57 */ 

从分析上述程序中虚基类Base的构造函数只执行了一次。

显然,当Derived的构造调用了虚基类Base的构造函数之后,

类Base1和类Base2对Base构造函数的调用被忽略了,这也是初始化虚基类

和初始化非虚基类不同的地方。

关键字virtual与派生方式关键字(public或private)的先后顺序无关紧要,

他只说明是“虚拟派生”。

一个基类在作为某些派生类虚基类的同时,又作为另一些派生类的非虚基类,

这种情况是允许的。

时间: 2024-11-09 03:10:31

C++虚基类的初始化的相关文章

C++的虚基类知识点

当在多条继承路径上有一个公共的基类,在这些路径的某几条汇合处,这个公共的基类就会产生多个实例(或多个副本),若只想保存这个基类的一个实例,可以将这个公共基类说明为虚基类. class x1:virtual public x{//... ...};class x2:virtual public x{//... ...};虚基类的初始化 虚基类(虚拟继承)的初始化与一般多继承的初始化在语法上是一样的,但构造函数的调用次序不同. 派生类的构造函数的调用次序有三个原则:(1)虚基类的构造函数在非虚基类之

C++虚基类详解

1.虚基类的作用从上面的介绍可知:如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员.在引用这些同名的成员时,必须在派生类对象名后增加直接基类名,以避免产生二义性,使其惟一地标识一个成员,如    c1.A::display( ).在一个类中保留间接共同基类的多份同名成员,这种现象是人们不希望出现的.C++提供虚基类(virtual base class )的方法,使得在继承间接共同基类时只保留一份成员.现在,将类A声明为

C++:虚基类

4.4.3 虚基类1.没什么要引入虚基类 如果一个类有多个直接基类,而这些直接基类又有一个共同的基类,则在最底层的派生类中会保留这个间接的共同基类数据成员的多分同名成员.在访问这些同名的成员时,必须在派生类对象后增加直接基类名,使其惟一地标识一个成员,以免产生二义性. //例 4.15 虚基类的引例 #include<iostream> using namespace std; class Base{ //声明类Base1和类Base2的共同的基类Base public: Base() { a

虚基类的用法

1 #include <iostream> 2 3 using namespace std; 4 5 class A 6 { 7 private: 8 int a; 9 public: 10 A(int x):a(x){} 11 void show() const 12 { 13 cout<<"a: "<<a<<endl; 14 } 15 ~A(){} 16 }; 17 class B:virtual public A //定义虚基类的用

重拾C++之虚函数和虚基类以及抽象类

一.引言 好久没接触过C++了,今天突然要用一点感觉号蛋疼,用惯了python感觉C++一点都不会了. 声明了一个类的对象居然用这种方法,脑子绝对是被驴(python)踢了 class A{  ...  }  a=A();//尼玛这都能行,被踢大了 二.虚函数和一般函数 虚函数就是加了vritual关键字的函数,引入虚函数的目的是为了实现多态性(在此为运行时的多态性),即可以通过父类的指针调用子类的对象,从而产生不同的效果.     virtual void show(){         co

C++语言笔记系列之十七——虚基类

1.虚基类 考虑这样一种情况:当某个类的部分或者全部直接基类是另一个共同基类派生而来,这些直接基类从上一级基类继承而来的成员就一定拥有相同的名称,这样就会产生二义性问题. 解决办法:当派生类和直接基类产生了二义性问题-->加类的作用域. 当派生类和间接基类产生了二义性问题-->虚基类. 2.虚基类的说明: class 派生类名:virtual 访问权限 基类名 {派生类定义}; 注意:在定义派生类时将需要继承的基类进行虚化声明,虚基类的说明在派生类的定义中完成. 作用:将基类说明为虚基类之后,

C++虚基类详解(转)

我们知道,如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员.在引用这些同名的成员时,必须在派生类对象名后增加直接基类名,以避免产生二义性,使其惟一地标识一个成员,如:    c1.A::display( ) 在一个类中保留间接共同基类的多份同名成员,虽然有时是有必要的,可以在不同的数据成员中分别存放不同的数据,也可以通过构造函数分别对它们进行初始化.但在大多数情况下,这种现象是人们不希望出现的.因为保留多份数据成员的拷贝

虚基类初始化问题

在包含有继承关系的类里,生成一个派生类对象,要调用构造函数进行初始化此对象,而构造函数的调用顺序是先调用最顶层基类的构造函数,次顶层....等:但在普通继承和虚继承里存在区别 普通继承:父类只能由其直接派生类初始化 1 class A 2 { 3 char a; 4 public: 5 A(char _a) :a(_a){ cout << a << endl; } 6 }; 7 8 class B:public A 9 { 10 char b; 11 public: 12 B(ch

虚基类练习:动物(利用虚基类建立一个类的多重继承,包括动物(animal,属性有体长,体重和性别),陆生动物(ter_animal,属性增加了奔跑速度),水生动物(aqu_animal,属性增加了游泳速度)和两栖动物(amp_animal)。)

Description 长期的物种进化使两栖动物既能活跃在陆地上,又能游动于水中.利用虚基类建立一个类的多重继承,包括动物(animal,属性有体长,体重和性别),陆生动物(ter_animal,属性增加了奔跑速度),水生动物(aqu_animal,属性增加了游泳速度)和两栖动物(amp_animal).其中两栖动物保留了陆生动物和水生动物的属性. Input 两栖动物的体长,体重,性别,游泳速度,奔跑速度(running_speed) Output 初始化的两栖动物的体长,体重,性别,游泳速度