从ACE_Task_Base派生的类(比如A类)有一个纯虚方法:
virtual int handler(int) = 0;
B类派生自A类,并具有纯虚方法的实现。没问题。
现在,问题是:A类的守护程序线程调用这个纯虚方法:
int A::svc(void)
{
while(true) {
// some function;
handler(void);
}
return 0;
}
如果从B的对象调用该方法,则毫无疑问。但是,如何从A?
调用这个纯虚方法答案 0 :(得分:0)
从handler
拨打A
将使用B
中提供的定义。
在任何地方调用纯虚方法都是安全的(除了构造函数),因为编译器会阻止您直接创建具有未实现的纯虚方法的对象。因此,您可以处理的任何对象都应该实现所有方法,因此您不必担心这样的事情。
答案 1 :(得分:0)
嗯,就像它已被指出的那样,这将有效。但是,如何工作需要深入研究如何在C ++中实现继承。简而言之,纯虚函数告诉编译器"假设这个函数存在,我稍后会给你定义"。这个'以后'在定义B时发生。这就是为什么你能够从A调用一个“不存在”的功能的原因'在A。
函数的继承可以简化为function signatures到内存地址的地图(也称为vtable
,virtual table
等)。
当继承普通函数时,派生类会添加到此映射。如果签名相同则无关紧要,该类将添加新条目。还有什么 - 它会以这种新的方式添加它。 signature是对Derived
类型的对象执行的操作。
但是,当Base
继承了virtual
个函数时,Dervied
类会替换映射条目,如果它找到相同的签名。这意味着任何试图在此对象上调用此签名的人现在将调用新地址,即被覆盖的函数。所有虚拟功能都是如此。
纯虚函数是一种特殊情况,更多是设计注意事项的补充。他们强制程序员实现某些功能,并在Interface设计组件或Template设计模式(以及其他)中使用。任何继承纯虚函数但不提供实现的类都不会被实例化 - 这会抛出编译时错误。
关于指导者的说明
&#39>条目'在构造对象期间完成功能。 Base
首先使用可用信息构建,然后Dervied
,然后覆盖Base
vtable中的信息。 这意味着如果从构造函数调用虚函数,则结果不符合预期。虚函数将解析为Base
的定义,并且在此情况下纯虚函数,崩溃试图取消引用空地址。