1、一个函数需要另一个类里面的函数做一些事情,这个类是一些不是一个处理方法,将这个类分化。
定义一个接口,将这个接口分化为多个具体处理方法的类(这个类继承接口类)。
例:
函数调用
CurveDataParser curveParser(str); //先进到大坑,大坑构造里面根据str分化进到小坑(坑为类)
curveParser.SetPath(path); //设置路径
curveParser.ReadAllCurve(data); //从小坑获取的数据返回
接口
class ICurveDataSet
{
public:
virtual ~ICurveDataSet() = 0 {}
virtual bool ReadAllCurve(data) = 0;
virtual void ResetPath(const string &path) = 0;
}
大坑
class CurveDaraParser
{
public:
jgCurveDataParser(LPCTSTR strType);
virtual ~CurveDataParser(void);
bool ReadAllCurve(data);
void SetPath(const string &path);
private:
ICurveDataSet * m_parser; //具体的解析实例
void InitParser(LPCTSTR strType); //初始化解析实例
}
//大坑cpp 分化小坑
CurveDataParser::CurveDataParser(LPCTSTR strType)
{
m_parser = NULL;
InitParser(strType);
}
CurveDataParser::~CurveDataParser(void)
{
if( NULL != m_parser ) { delete m_parser; m_parser = NULL; }
}
// 初始化解析实例
void CurveDataParser::InitParser(LPCTSTR strType)
{
CString sType( strType );
sType.MakeLower();
if( _T("716") == sType )
{
m_parser = new jg716DataSet();
}
else if( _T("las") == sType )
{
m_parser = new jgLasDataSet();
}
else if( _T("dat") == sType )
{
m_parser = new jgDqDatDataSet();
}
else if( _T("wis") == sType )
{
m_parser = new jgWisDataSet();
}
else if ( _T("txt") == sType )
{
m_parser = new jgTxtDataSet();
}
}
//以一个小坑为例
class LasDataSet : public ICurveDataSet
{
public:
LasDataSet();
public:
virtual bool ReadAllCurve(data);
void ResetPath(const string &path);
}
2、父类 xx = new 子类()与子类 xx = new 子类()的区别
子类继承父类的所有(包括属性以及方法), 也就是说子类包含的内容应该是比父类要大的. 如果正常环境下, 把一个父类转换成子类一定会损失精度. 但是如果父类对象本身就是用子类去new出来的, 就类似于一个本来就是儿子角色的人, 去装了一会儿父亲, 这个角色是可以在未来转换回去的, 但是一个父亲, 永远不可能去装儿子的.
父类 xx = new 子类()定义的对象无法调用非从父类继承的方法。
3、很典型的c++类面试题
class String
{
public:
String(const char *str = NULL); // 通用构造函数
String(const String &another); // 拷贝构造函数
~String(); // 析构函数
String& operater =(const String &rhs); // 赋值函数
private:
char* m_data; // 用于保存字符串
};
String::String(const char *str)
{
if(str == NULL)
{
m_data = new char[1];
m_data[0] = "\0";
}
else
{
int len = strlen(str) + 1;
m_data = new char[len];
strcpy(m_data, str);
}
}
String::String(const String &another)
{
m_data = new char[strlen(another) + 1];
strcpy(m_data, another.m_data);
}
String::String& operator =(const String &rhs)
{
if(&rhs == this) return *this;
m_data = new char[strlen(rhs.m_data) + 1]
strcpy(m_data, rhs.m_data);
return *this;
}
String::~String()
{
delete[] m_data;
}