解决多重继承中函数同名方案

原创 2004年07月09日 21:56:00

当两个接口中有相同的函数声明名,比如:
interface IA
{
    virtual void Fun()=0;
};
interface IB
{
    virtual void Fun()=0;
};

类CD继承这两个接口:
class CD : public IA,public IB
{
public:
    void Fun();
};

如果要实现这样的效果:针对IA和IB的接口函数Fun有不同的实现,就涉及到多重继承函数同名的问题.

经典的解决方案是ARM中提出的引入中间类:
class IAImpl : public IA
{
public:
    virtual void Fun()
    {
 InternalFunA();
    }

    virtual void InternalFunA() = 0;
};

class IBImpl : public IB
{
public:
    virtual void Fun()
    {
 InternalFunB();
    }

    virtual void InternalFunB() = 0;
};

现在的class CD应该是这个样子
class CD:public IAImpl,public IBImpl
{
public:
    void InternalFunA()
    {
        // 这里实现IA::Fun()
    }
    void InternalFunB()
    {
        // 这里实现IB::Fun()
    }
};

这样,就成功解决了多重继承的同名函数问题,这里IAImpl和IBImpl中的Fun函数使用了最简单的Template Method模式.

当然,这里使用了虚函数,可以用模板来替换,更为高效的一个解决方案如下:
template<typename T>
class IAImpl : public IA
{
public:
    virtual void Fun()
    {
        T* pT = static_cast<T*>(this);
       pT->InternalFunA();
    }
};

template<typename T>
class IBImpl : public IB
{
public:
    virtual void Fun()
    {
        T* pT = static_cast<T*>(this);
 pT->InternalFunB();
    }
};

class CD:public IAImpl<CD>,public IBImpl<CD>
{
public:
    void InternalFunA()
    {
        // 这里实现IA::Fun()
    }
    void InternalFunB()
    {
        // 这里实现IB::Fun()
    }
};

这样避免了虚函数调用的开销.

多重继承(不同的父类中有同名函数)

C++子类中调用被重写的父类的方式:BaseClass::overrideMethod();root@romulus-laptop:/work/test/twoFather# cat *.c *.h ...
  • xiaoxiaosunzhao
  • xiaoxiaosunzhao
  • 2011年05月07日 00:37
  • 2393

python学习笔记6.4-类的多重继承(super()函数)

说到面向对象,就少不了研究面向对象的特点(继承,封装,多态)。Python中类的继承的关键是正确使用super()函数,而这恰好是我们理解最不好的地方。...
  • jinxiaonian11
  • jinxiaonian11
  • 2016年12月18日 14:24
  • 20887

接口多重继承及注意事项

又是一个牛角尖,只是语言不够严谨而已,Java中只支持类的单继承,接口之间的继承同样也是使用extends关键字,但是接口之间是支持多继承的,如下面的例子: interface IP1 { ...
  • qq869348527
  • qq869348527
  • 2016年08月22日 18:52
  • 938

C#接口浅谈(多重继承)

接口是啥? 简单来说就是一种约定,也是C#里面非常重要的. 我们知道在C#中一个派生类(子类)只能由一个父类,那要继承多种状态的时候怎么办呢,这个时候接口来了。 1.接口是一种约定 2.接口是抽...
  • a1455990364
  • a1455990364
  • 2017年04月09日 16:06
  • 373

c++ 多重继承歧义及其解决办法

关于c++中多重继承该不该使用的争论不是我们关注的问题,但是现实世界很多模型确实是多重继承类别。和单一继承相比,它比较复杂,也不太好理解,而且多基派生可能会引起二义性。下面我们就说说多重继承可能的二义...
  • zb872676223
  • zb872676223
  • 2014年08月18日 14:20
  • 2310

多重继承的二义性以及解决方法

//多重继承的二义性以及解决方法 //学习目的:了解类的继承原理及多重继承二义性的解决方法。 /* //本程序代码来源《MFC权威剖析》p68 */ ////////////////////...
  • windows_nt
  • windows_nt
  • 2013年02月27日 09:31
  • 5343

c++类多重继承初始化顺序

c++类多重继承时,初始化顺序是一个基础的问题,笔者每次清楚了以后,过段时间有点含糊了,有些基础的问题,在实际开发中,用到的频率少,今天做一个总结跟大家一起分享。 这里先讨论一般的基类继承时的初始化...
  • u010519381
  • u010519381
  • 2013年08月08日 13:44
  • 3347

C++继承基类与子类中的同名变量与同名函数

在C++中,允许基类和子类中含有同名的成员变量或成员函数(包括虚函数和非虚函数),因此在使用时,将会有判断当前作用域有效变量名的问题。         一、基类作用域         在基类作用域(即...
  • gswjj1
  • gswjj1
  • 2013年07月04日 00:49
  • 1484

【虚函数、虚拟指针、虚表指针】解析多重继承时,虚表的分布

#include using namespace std; //抽象基类:动物类 class CAnimal { public: virtual void EatFood(string str...
  • xiaorui51
  • xiaorui51
  • 2016年01月08日 13:56
  • 823

内部类实现多重继承

多重继承指的是一个类可以同时从多于一个的父类那里继承行为和特征,然而我们知道Java为了保证数据安全,它只允许单继承。有些时候我们会认为如果系统中需要使用多重继承往往都是糟糕的设计,这个时候我们往往需...
  • litaosdau
  • litaosdau
  • 2014年08月22日 16:23
  • 613
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:解决多重继承中函数同名方案
举报原因:
原因补充:

(最多只允许输入30个字)