在声明成员函数时

时间:2012-08-04 13:03:22

标签: c++ function abstract-class definition member

我有一个抽象的基类。

我有一堆成员函数,它们不是私有的,也不是静态的,也不是模板,只是普通的公共成员函数。

我注意到我 来定义在其他函数的定义中调用*的任何这些公共普通函数,即使这些函数没有被运行main中的任何代码。

更值得我注意的是,无论如何,如果类是抽象的,那么为什么实际上应该强制定义任何函数,如果类本身不会以任何方式实例化?

这是我在这里发布的第一个问题,如果我没有好好解释自己或做错事,那就很抱歉。

提前感谢您的帮助!

这是我正在谈论的课程的缩短版本:

#ifndef PROCESS_H_INCLUDED
#define PROCESS_H_INCLUDED

#include <iostream>
#include <memory>


using std::weak_ptr;
using std::shared_ptr;

class Process;

typedef shared_ptr<Process> shProcess;
typedef weak_ptr<Process> wProcess;


class Process
{
    friend class ProcessManager;
public:

    inline void AttachChild(shProcess shChild);

    /*
    FOR EXAMPLE I CAN LEFT THE FUNCTION ABOVE WITHOUT BEING DEFINE, BUT I HAVE
    TO DEFINE THE FUNCTION BELOW OR I GET A COMPILER ERROR
    COULD IT BE BECAUSE EVEN IF THIS CLASS IS ABSTRACT I AM USING IT AS A 
    PARAMETER OF OTHER FUNCTIONS FOR POLIMORPHIC PURPOSES?
    */
    shProcess RemoveChild(void){return shProcess();}//reliases ownership of the child  

    shProcess PeekChild(void){return m_shChild;} //doesn´t release ownership of the child

};

#endif //PROCESS_H_INCLUDED

2 个答案:

答案 0 :(得分:1)

如果链接器可以证明它们永远不会被调用,那么你只能声明函数(而不是提供正文)。

虚函数可能会妨碍这一点,因为编译器必须构建一个vtable(其他一些编译单元可能从类继承并调用函数),然后链接器的任务就更加困难了。 / p>

答案 1 :(得分:0)

您可以通过使用语法= 0的好奇但标准的使用来实现您想要的效果,如

class T {
    // ...
  public:
    virtual int foo() = 0;
};