虚函数(关键字:virtual)
关于虚函数,今天自己整理了一下,整理不到位的地方,希望大家指点一下。
个人觉得,首先需要明确两个概念,就是重写和重载。重载就是在一个类里面,我们可以把函数的名字取的一样,但是参数表要不同的方法(返回值类型可以不一样)。重写就是当一个子类继承父类,子类和父类中的方法名称,参数的个数、参数的类型以及返回值类型都一致时,就说明子类重写了父类中的方法。一般需要重写的函数,函数声明中都有virtual关键字。如果虚函数中有代码的并明确允许子类去重写,但是子类可以不重写,直接拿来用。
关于虚函数,今天自己整理了一下,整理不到位的地方,希望大家指点一下。
个人觉得,首先需要明确两个概念,就是重写和重载。重载就是在一个类里面,我们可以把函数的名字取的一样,但是参数表要不同的方法(返回值类型可以不一样)。重写就是当一个子类继承父类,子类和父类中的方法名称,参数的个数、参数的类型以及返回值类型都一致时,就说明子类重写了父类中的方法。一般需要重写的函数,函数声明中都有virtual关键字。如果虚函数中有代码的并明确允许子类去重写,但是子类可以不重写,直接拿来用。
C++中有虚函数的概念,用virtual关键字来表示,每个类都会有一个虚函数表,该虚函数表首先会从父类中继承得到父类的虚函数表, 如果子类中重写了父类的虚函数(不管重写后的函数是否为虚函数),要调用哪个虚函数,是根据当前实际的对象来判断的(不管指针所属类型是否为当前类,有可能是父类型),指针当前指向的是哪种类型的对象,就调用相应类型中类定义的虚函数。每个类只有一张虚拟函数表,所有的对象共用这张表。
参考代码:
父类:class __declspec(dllexport) DCDBSQL
虚函数声明:virtual const char* GetValue(TINT32 pos) throw(DCDBException) = 0;
子类:继承父类
class DLLEXPORT DCRDBSQL : public DCDBSQL
重写父类的虚函数
const char* DCRDBDQL::GetValue(TINT32 pos) throw()
{
char* ptr = NULL;
if(!((pos > GetResultColsNum()) || (pos <= 0)))
{
if (DATA_TYPE_CHAR == m_resultIdx[pos-1].type)
{
ptr = m_resultStringValue[m_resultIdx[pos-1].pos];
}
else
{
ptr = m_resultBlobValue[m_resultIdx[pos-1].pos];
}
}
return ptr;
}
参考链接:
http://blog.csdn.net/rfb0204421/article/details/3548929
http://blog.csdn.net/zzsyzxzm/article/details/7489732