抽象基类守护进程如何调用其纯虚方法?

时间:2014-05-08 05:48:32

标签: c++

从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?

调用这个纯虚方法

2 个答案:

答案 0 :(得分:0)

handler拨打A将使用B中提供的定义。

在任何地方调用纯虚方法都是安全的(除了构造函数),因为编译器会阻止您直接创建具有未实现的纯虚方法的对象。因此,您可以处理的任何对象都应该实现所有方法,因此您不必担心这样的事情。

答案 1 :(得分:0)

嗯,就像它已被指出的那样,这将有效。但是,如何工作需要深入研究如何在C ++中实现继承。简而言之,纯虚函数告诉编译器"假设这个函数存在,我稍后会给你定义"。这个'以后'在定义B时发生。这就是为什么你能够从A调用一个“不存在”的功能的原因'在A。

函数的继承可以简化为function signatures到内存地址的地图(也称为vtablevirtual table等)。

当继承普通函数时,派生类会添加到此映射。如果签名相同则无关紧要,该类将添加新条目。还有什么 - 它会以这种新的方式添加它。 signature是对Derived类型的对象执行的操作。

但是,当Base继承了virtual个函数时,Dervied会替换映射条目,如果它找到相同的签名。这意味着任何试图在此对象上调用此签名的人现在将调用新地址,即被覆盖的函数。所有虚拟功能都是如此。

纯虚函数是一种特殊情况,更多是设计注意事项的补充。他们强制程序员实现某些功能,并在Interface设计组件或Template设计模式(以及其他)中使用。任何继承纯虚函数但不提供实现的类都不会被实例化 - 这会抛出编译时错误。

关于指导者的说明

&#39>条目'在构造对象期间完成功能。 Base首先使用可用信息构建,然后Dervied,然后覆盖Base vtable中的信息。 这意味着如果从构造函数调用虚函数,则结果不符合预期。虚函数将解析为Base的定义,并且在此情况下纯虚函数,崩溃试图取消引用空地址。