要触发动态绑定需要满足两个条件:
1.必须指定为虚函数;
2.必须通过基类类型的引用或指针进行函数调用;
Q1·虚函数和纯虚函数的区别?纯虚函数在类定义中 有 =0; 的赋值操作,本类中无法实现,必须下放子类实现
Q2·子类是否必须实现基类中的虚函数?
Q3·重写规则已经可以实现对同名方法的选择访问,为什么还需要虚函数机制?
---------------
基类类型引用和指针的关键点在于 静态类型 和 动态类型 可能不同;
实例和对象的区别:
Class CAnimal{...}; //类类型的定义;
CAnimal animal; //对象的声明;此时,animal只是 CAnimal 的一个 对象;
animal = new CAnimal();//对象的实例化;此时,可以说 animal 是 CAnimal 的一个 实例了;
---------------结构体的构造,拷贝构造,赋值运算定义---------
struct LUITSLIB_EXPORT HisAlarmEvent
{
QT_UINT16 u16DevId; //设备ID
QT_UINT16 u16SigId; //信号ID
//构造
HisAlarmEvent(void)
{
memset(this, 0, sizeof(*this));
}
//拷贝构造
HisAlarmEvent(const HisAlarmEvent & other)
{
memcpy(this, &other, sizeof(*this));
}
//赋值运算
const HisAlarmEvent & operator = (const HisAlarmEvent & other)
{
memcpy(this, &other, sizeof(*this));
return *this;
}
};
{
public:
virtual CB();
~CB();
}
class CInherit:CB
{
public :
virtual CInherit();
~CInherit();
}
int main()
{
CB b = CInherit();
}
//b释放的时候只能调用到 ~CB() ,无法访问到~CInherit()
原因: 同仁解释为,b对象无法访问子类的非虚函数,没有建立对应的指针链接
--------构造函数末尾追加对成员和父类的赋值-----
class CB
{
public:
CB(int a);
}
class CA;
Class CInherit : CB
{
CA ca;
}
CInherit::CInherit(int a):CB(a),ca(a)
{
}
-------------
1.必须指定为虚函数;
2.必须通过基类类型的引用或指针进行函数调用;
Q1·虚函数和纯虚函数的区别?纯虚函数在类定义中 有 =0; 的赋值操作,本类中无法实现,必须下放子类实现
Q2·子类是否必须实现基类中的虚函数?
Q3·重写规则已经可以实现对同名方法的选择访问,为什么还需要虚函数机制?
---------------
基类类型引用和指针的关键点在于 静态类型 和 动态类型 可能不同;
静态类型:static type,在编译时可知的引用类型和指针类型;
动态类型:daynamic type,指针或者引用绑定的类型
实例和对象的区别:
Class CAnimal{...}; //类类型的定义;
CAnimal animal; //对象的声明;此时,animal只是 CAnimal 的一个 对象;
animal = new CAnimal();//对象的实例化;此时,可以说 animal 是 CAnimal 的一个 实例了;
---------------结构体的构造,拷贝构造,赋值运算定义---------
struct LUITSLIB_EXPORT HisAlarmEvent
{
QT_UINT16 u16DevId; //设备ID
QT_UINT16 u16SigId; //信号ID
//构造
HisAlarmEvent(void)
{
memset(this, 0, sizeof(*this));
}
//拷贝构造
HisAlarmEvent(const HisAlarmEvent & other)
{
memcpy(this, &other, sizeof(*this));
}
//赋值运算
const HisAlarmEvent & operator = (const HisAlarmEvent & other)
{
memcpy(this, &other, sizeof(*this));
return *this;
}
};
-------父类非virtual 的析构函数的影响------
class CB{
public:
virtual CB();
~CB();
}
class CInherit:CB
{
public :
virtual CInherit();
~CInherit();
}
int main()
{
CB b = CInherit();
}
//b释放的时候只能调用到 ~CB() ,无法访问到~CInherit()
原因: 同仁解释为,b对象无法访问子类的非虚函数,没有建立对应的指针链接
--------构造函数末尾追加对成员和父类的赋值-----
class CB
{
public:
CB(int a);
}
class CA;
Class CInherit : CB
{
CA ca;
}
CInherit::CInherit(int a):CB(a),ca(a)
{
}
-------------