C++类的多重继承与虚拟继承

在过去的学习中,我们始终接触的单个类的继承,但是在现实生活中,一些新事物往往会拥有两个或者两个以上事物的属性,为了解决这个问题,C++引入了多重继承的概念,C++允许为一个派生类指定多个基类,这样的继承结构被称做多重继承。

举个例子,交通工具类可以派生出汽车和船连个子类,但拥有汽车和船共同特性水陆两用汽车就必须继承来自汽车类与船类的共同属性。

由此我们不难想出如下的图例与代码:

当一个派生类要使用多重继承的时候,必须在派生类名和冒号之后列出所有基类的类名,并用逗好分隔。

//程序作者:管宁//站点:www.cndev-lab.com//所有稿件均有版权,如要转载,请务必著名出处和作者#include <iostream>using namespace std;class Vehicle{    public:        Vehicle(int weight = 0)        {            Vehicle::weight = weight;        }        void SetWeight(int weight)        {            cout<<"重新设置重量"<<endl;            Vehicle::weight = weight;        }        virtual void ShowMe() = 0;    protected:        int weight;};class Car:public Vehicle//汽车{    public:        Car(int weight=0,int aird=0):Vehicle(weight)        {            Car::aird = aird;        }        void ShowMe()        {            cout<<"我是汽车!"<<endl;        }    protected:        int aird;};class Boat:public Vehicle//船{    public:        Boat(int weight=0,float tonnage=0):Vehicle(weight)        {            Boat::tonnage = tonnage;        }        void ShowMe()        {            cout<<"我是船!"<<endl;        }    protected:        float tonnage;};class AmphibianCar:public Car,public Boat//水陆两用汽车,多重继承的体现{    public:        AmphibianCar(int weight,int aird,float tonnage)        :Vehicle(weight),Car(weight,aird),Boat(weight,tonnage)        //多重继承要注意调用基类构造函数        {

}        void ShowMe()        {            cout<<"我是水陆两用汽车!"<<endl;        }};int main(){    AmphibianCar a(4,200,1.35f);//错误    a.SetWeight(3);//错误    system("pause");}

上面的代码从表面看,看不出有明显的语发错误,但是它是不能够通过编译的。这有是为什么呢?

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
, 继承
, 属性
, 事物
, 类名
, 类的继承
, weight
, 多重继承
, 继承c++
, C++继承
, 单个继承
, 虚拟继承
多重
c 虚拟继承、c 菱形虚拟继承、c 多重继承、c多重继承示例、objective c 多重继承,以便于您获取更多的相关知识。

时间: 2024-08-03 08:26:22

C++类的多重继承与虚拟继承的相关文章

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

一.多态 C++多态通过继承和动态绑定实现.继承是一种代码或者功能的传承共享,从语言的角度它是外在的.形式上的,极易理解.而动态绑定则是从语言的底层实现保证了多态的发生--在运行期根据基类指针或者引用指向的真实对象类型确定调用的虚函数功能!通过带有虚函数的单一继承我们可以清楚的理解继承的概念.对象模型的分布机制以及动态绑定的发生,即可以完全彻底地理解多态的思想.为了支持多态,语言实现必须在时间和空间上付出额外的代价(毕竟没有免费的晚餐,更何况编译器是毫无感情): 1.类实现时增加了virtual

消息印射-两个MFC类实现多重继承,虚继承基类时候派生类的消息映射出错,求解决方法

问题描述 两个MFC类实现多重继承,虚继承基类时候派生类的消息映射出错,求解决方法 一个类实现了可悬浮侧靠的对话框,另一个类实现了有滑动条的对话框,然后我就想到了多重继承来实现一个可悬靠带滑动条的对话框.由于看书上说要虚继承基类,并且在初始化成员类表中显示初始化基类,这些都有做,但是在消息印射部分出了问题. 这里编辑代码不方便,详细情况在帖子中 http://bbs.csdn.net/topics/390871222 不胜感激

c++面试常用知识(sizeof计算类的大小,虚拟继承,重载,隐藏,覆盖)

一. sizeof计算结构体 注:本机机器字长为64位 1.最普通的类和普通的继承 #include<iostream> using namespace std; class Parent{ public: void fun(){ cout<<"Parent fun"<<endl; } }; class Child : public Parent{ public: void fun(){ cout<<"Child fun&quo

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

1.为什么要引入虚拟继承虚拟继承是多重继承中特有的概念.虚拟基类是为解决多重继承而出现的.如:类D继承自类B1.B2,而类B1.B2都继承自类A,因此在类D中两次出现类A中的变量和函数.为了节省内存空间,可以将B1.B2对A的继承定义为虚拟继承,而A就成了虚拟基类.实现的代码如下: class Aclass B1:public virtual A;class B2:public virtual A;class D:public B1,public B2; 虚拟继承在一般的应用中很少用到,所以也往

关于虚拟继承类的大小问题探索,VC++ 和 G++ 结果是有区别的

昨天笔试遇到个 关于类占用的空间大小的问题,以前没怎么重视,回来做个试验,还真发现了问题,以后各位笔试考官门,出题时请注明是用什么编译器.        vc6/vc8 cl 和 Dev-C 的g++ 来做的测试: 上代码, 测试代码: #include <stdio.h>class A{public: int x;  int y; A() {  x = 1;     y = 2; }; void go() {  printf("A go()\n"); }    virtu

Linux Debugging(四): 使用GDB来理解C++ 对象的内存布局(多重继承,虚继承)

      前一段时间再次拜读<Inside the C++ Object Model> 深入探索C++对象模型,有了进一步的理解,因此我也写了四篇博文算是读书笔记: Program Transformation Semantics (程序转换语义学) The Semantics of Copy Constructors(拷贝构造函数之编译背后的行为) The Semantics of Constructors: The Default Constructor (默认构造函数什么时候会被创建出

Visual C++ 8.0对象布局的奥秘:虚函数、多继承、虚拟继承

从MS Visual C++ Team的Andy Rich那里又偷学到一招:VC8的隐含编译项/d1reportSingleClassLayout和/d1reportAllClassLayout .看个复杂的例子吧(如下),现在假设我们想知道Derived类的对象布局,怎么办? 在Project Properties->C++->Command Line->Additional Options里面加上/d1reportSingleClassLayoutDerived吧! class Co

Java:使用内部类实现类的多重继承

Java不支持类的多重继承,但可以使用内部类来继承实现更多的类. 下面的例子,目标类需要继承两个抽象类(A和B).目标类C本身继承类A,并使用一个匿名内部类继承另一个类B. MultiImplementation.java abstract class A { abstract void methodA(); } abstract class B { abstract void methodB(); } class C extends A { @Override void methodA() {

Python类的多重继承问题深入分析_python

正文 首先得说明的是,Python的类分为经典类 和 新式类 经典类是python2.2之前的东西,但是在2.7还在兼容,但是在3之后的版本就只承认新式类了 新式类在python2.2之后的版本中都可以使用 经典类和新式类的区别在于: 经典类是默认没有派生自某个基类的,而新式类是默认派生自object这个基类的: 复制代码 代码如下: # old style class A():pass # new style class A(obejct):pass 2.经典类在类多重继承的时候是采用从左到右