请教一个关于类封装的问题~~~~

来源:百度知道 编辑:UC知道 时间:2024/06/02 09:12:10
一个基类Base,A和B继承自Base,这个很简单。
因为A和B提供给外部的接口函数形式很相似,我又希望能够统一封装接口。那么,是定义一个C,同时继承自A和B呢?还是另外写一个和A、B毫不相关的类D来封装接口呢?

比方说:
class Base{
public:
virtual BOOL Fun(LPCTSTR lpszName, INT iFlag) = 0;
};

class A : public Base {
public:
virtual BOOL Fun(LPCTSTR lpszName, INT iFlag)
{
...
return TRUE;
}
};

class B : public Base {
public:
virtual BOOL Fun(LPCTSTR lpszName, INT iFlag)
{
...
return TRUE;
}
};

class C : public A, public B {
public:
virtual BOOL Fun(LPCTSTR lpszName, INT iFlag)
{
if (0 == iFlag)
return A::Fun(lpszName, iFlag);
else
return B::Fun(lpszName, iFlag);
}
};

class D{
public:
BOOL Fun(LPCTSTR lpszName, INT iFlag)
{
if (0 == iFlag)

按道理两者都可以,因为能够达到你想要的目的,但是“尽量不要使用多继承”是C++的一条准则——虽然它有时能够带来方便。
如果采用C方案,容易产生“继承二义性”:base->A,B->C,这样的结构形成了菱形,详细的例子可以参考这篇文章:http://www.llhc.edu.cn/jsjx/kj/lzx/kejian/content/chapter6/chapter6_1_5.htm
虽然你的代码可以编译通过,但是危险是“隐藏”在其中的,当你扩充功能的时候,出现错误的时候,有可能还不知道自己到底错在什么地方呢!

对于D方案,在设计模式中,你可以将D类看做一个Factory:可能你需要对m_a、m_b进行初始化,有点麻烦,但是按照对象的方式来使用它们,显然会更加地安全,也能够方便你补充接口和更改需求。
所以——我推荐D方法。

附带一个多重继承二义性的代码例子
#include <iostream>
using namespace std;
class Base
{
public:
int bas;
Base(){bas =100};
};

class A : public Base
{

};
class B : public Base
{

};

class C :public A,public B
{};

void main()
{
C obj;
// cout<<obj.bas; //二义性导致出错
cout<<obj.A::bas;//正确
}

C

具体情况要看你具体要