C++中的虚继承(virtual inheritance)

虚继承主要是避免基类重复被继承, 包含多个相同基类, 导致歧义性, 使用虚基类(virtual base class)继承, 可以使派生对象只包含一份基类文件.

如果不使用虚继承, 则派生类需要提供一份自己的示例版本,

参见: http://blog.csdn.net/caroline_wendy/article/details/18077235

代码:

/*
 * cppprimer.cpp
 *
 *  Created on: 2014.1.10
 *      Author: Spike
 */

/*eclipse cdt, gcc 4.8.1*/

#include <iostream>
#include <string>  

class ZooAnimal {
public:
    void zooprint (void) { std::cout << "Zoo Animal!" << std::endl; }
};  

class Raccoon : public virtual ZooAnimal {
public:
    void raccprint (void) { std::cout << "Raccoon!" << std::endl; }
};  

class Bear : public virtual ZooAnimal {
public:
    void bearprint (void) { std::cout << "Bear!" << std::endl; }
};  

class Panda : public Bear, public Raccoon {
public:
    void pandprint (void) { std::cout << "Panda!" << std::endl; }
};  

void dance (Bear& B) {
    B.bearprint();
}  

void rummage (Raccoon& R) {
    R.raccprint();
}  

int main (void)
{
    Panda P;
    P.zooprint();
    dance(P);
    rummage(P);
}

输出:

Zoo Animal!
Bear!
Raccoon!

作者:csdn博客 Spike_King

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
, class
, include
, 虚基类
, virtual
, c++虚基类
, 示例
, void
, virtual继承
虚继承
virtual inheritance、c virtual 继承、c 虚继承、c 虚拟继承、c 继承 虚函数,以便于您获取更多的相关知识。

时间: 2024-10-26 05:52:21

C++中的虚继承(virtual inheritance)的相关文章

C++:虚继承(virtual inheritance) 详解

在多重继承(multiple inheritance)中, 可能出现多个基类继承自同一个基类, 即"菱形继承", 会导致最顶层的基类, 被复制多次; 可以采用虚继承(virtual inheritance)的方式, 使派生类(derived class)只保留最顶层基类的一个副本. virtual, 即需要vptr(virtual table pointer), 即虚表指针, 额外占用4个字节; 代码如下: /* * test.cpp * * Created on: 2014.04.1

C++中虚继承的构造(construct)和析构(destruct)顺序

虚继承(virtual inheritance)的构造(construct)和析构(destruct)顺序 在多重继承的时候, 构造顺序是 虚继承按顺序优先, 再次是其他按顺序, 由基类至派生类; 析构顺序正好相反; 代码如下: /* * cppprimer.cpp * * Created on: 2014.1.10 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <iostream> #include <string>

C++中复制(copy) 和 虚复制(virtual copy) 的 区别

在继承过程中, 需要区分复制(copy)和虚复制(virtual copy); 在派生类转换为基类时, 复制(copy)有可能切掉(sliced down)派生对象的派生部分, 只保留基类部分, 使派生类的虚函数无法使用; 为了避免此情况, 如果传入是对象, 则可以定义虚函数clone, 使派生类继承此虚函数, 再传入容器, 可以重载方法; 另外, 如果传入是实参, 使用shared_ptr<Base>配合make_shared<Derived>添加容器, 也可以进行动态绑定; 再

C++中虚函数(virtual function) 的 使用范围

虚函数(virtual function) 在 基函数(base function) 和 派生函数(derived function) 之间可以覆写(override); 如果派生函数有与虚函数同名的函数, 则会隐藏虚函数, 但是虚函数还会在; 由于派生对象和基对象可以转换, 可以只使用基对象部分; 派生对象的虚函数会覆写基对象的虚函数; 代码: /* * cppprimer.cpp * * Created on: 2013.11.13 * Author: Caroline */ /*eclip

C++多重继承与虚继承分析_C 语言

本文以实例形式较为全面的讲述了C++的多重继承与虚继承,是大家深入学习C++面向对象程序设计所必须要掌握的知识点,具体内容如下: 一.多重继承 我们知道,在单继承中,派生类的对象中包含了基类部分 和 派生类自定义部分.同样的,在多重继承(multiple inheritance)关系中,派生类的对象包含了每个基类的子对象和自定义成员的子对象.下面是一个多重继承关系图: class A{ /* */ }; class B{ /* */ }; class C : public A { /* */ }

C++对象布局及多态探索之菱形结构虚继承

这次我们看看菱形结构的虚继承.虚继承的引入本就是为了解决复杂结构的继承体系问题.上一篇我们在讨论虚继承时用的是一个简单的继承结构,只是为了打个铺垫. 我们先看看这几个类,这是一个典型的菱形继承结构.C100和C101通过虚继承共享同一个父类C041.C110则从C100和C101多重继承而来. struct C041{ C041() : c_(0x01) {} virtual void foo() { c_ = 0x02; } char c_;};struct C100 : public vir

C++:虚函数(virtual function)缺省参数的异常表现及正确使用

避免定义基类(base class)虚函数的缺省参数, 如果基类虚函数包含缺省参数, 派生类不要重新定义, 会产生异常; 虚函数(virtual)是动态绑定(dynamically bound),缺省参数是静态绑定(statically bound). 如果派生类(derived class)重新定义缺省值, 实例化, 执行函数正常; 但在动态绑定时, 会出现,执行基类的缺省参数, 却是派生类的行为, 这样的异常举动. talk is cheap, show you the code. 注意观察

C++:类的虚函数及虚继承所占的空间

char占用一个字节, 但不满足4的倍数时, 会进行数据对齐, 使用4的倍数的字节(byte). GCC: GCC中, 无论是虚函数还是虚继承, 都需要将指针存储在虚函数表(virtual function table), 占用4个字节. 继承会继承基类的数据, 和虚函数表, 即继承基类的空间. 代码: /* * test.cpp * * Created on: 2014.04.20 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <

C++中的虚函数的实现方法

学习 C++ 的同志不知道有没有和我一样遇到过这样的困惑:C++中的虚函数到底怎么实现的?在各种继承关系中,虚函数表的结构到底是什么样的?曾经我是很想当然,可是后来在使用ATL的过程中,我发现并不是我想的那样.大家知道,利用C++语言本身的特性进行COM编程当然是很方便的事,但是你就得随时随地都知道那虚函数表里头到底是些什么东西.讲C++语法的书没有义务告诉你C++产生的虚函数表是什么样的,这就是头痛的所在. 自已做试验是件很快乐的事,我很愿意这么做. 首先写个函数,作为我们实验的基础.传入虚函