内容简介:[TOC]自己这里在写接口设计的时候,遇到一个问题。类结构设计如下:一开始是普通继承,发现TestInheritedB需要把接口ITestBase里面的纯虚接口都要实现一遍,即使TestInheritedA中已经实现了一遍。翻了一下《深度探索c++对象模型》,改成了虚继承就可以了
[TOC]
自己这里在写接口设计的时候,遇到一个问题。类结构设计如下:
一开始是普通继承,发现TestInheritedB需要把接口ITestBase里面的纯虚接口都要实现一遍,即使TestInheritedA中已经实现了一遍。翻了一下《深度探索c++对象模型》,改成了虚继承就可以了
普通继承
代码如下:
class ITestBase { public: virtual void FuncBase() = 0; }; class ITestInheritedBase : public ITestBase { public: virtual void FuncInheritedBase() = 0; }; class TestInheritedA : public ITestBase { public: TestInheritedA(); virtual ~TestInheritedA(); virtual void FuncBase() { cout << "TestInheritedA::FuncBase" << endl; }; }; class TestInheritedB : public ITestInheritedBase, public TestInheritedA { public: TestInheritedB(); virtual ~TestInheritedB(); // 不实现的话报错error C2259: “TestInheritedB”: 不能实例化抽象类 //virtual void FuncBase() //{ // cout << "TestInheritedB::FuncBase" << endl; //} virtual void FuncInheritedBase() { cout << "TestInheritedB::FuncInheritedBase" << endl; }; };
报错信息如下:
error C2259: “TestInheritedB”: 不能实例化抽象类
虚继承
代码如下:
class ITestBase { public: virtual void FuncBase() = 0; }; class ITestInheritedBase : virtual public ITestBase { public: virtual void FuncInheritedBase() = 0; }; class TestInheritedA : virtual public ITestBase { public: TestInheritedA(); virtual ~TestInheritedA(); virtual void FuncBase() { cout << "TestInheritedA::FuncBase" << endl; }; }; class TestInheritedB : public ITestInheritedBase, public TestInheritedA { public: TestInheritedB(); virtual ~TestInheritedB(); // 不实现的话,也不会报错 //virtual void FuncBase() //{ // cout << "TestInheritedB::FuncBase" << endl; //} virtual void FuncInheritedBase() { cout << "TestInheritedB::FuncInheritedBase" << endl; }; };
类图
对象模型
问题解决的同时,也复习了下C++对象模型也还是挺有意思的。借用参考[2]中的一张虚菱形继承的图片。主要思想就是把共有的父类放在了最后,而且保证只有一个,解决了虚继承的二义性。
参考
[1] 《深度探索C++对象模型》 [2] 图说C++对象模型:对象内存布局详解
以上所述就是小编给大家介绍的《虚继承解决纯虚接口的多次实现问题》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- PHP类继承、接口继承关系概述
- F#接口由于单位继承故障
- Golang OOP、继承、组合、接口
- Golang面向对象编程之继承&虚基类【组合&接口】
- [ PHP 内核与扩展开发系列] 类与面向对象:接口实现与类的继承
- 028.Python面向对象继承(单继承,多继承,super,菱形继承)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Design for Hackers
David Kadavy / Wiley / 2011-10-18 / USD 39.99
Discover the techniques behind beautiful design?by deconstructing designs to understand them The term ?hacker? has been redefined to consist of anyone who has an insatiable curiosity as to how thin......一起来看看 《Design for Hackers》 这本书的介绍吧!