Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关于成员函数的声明_C++_Function_Abstract Class_Definition_Member - Fatal编程技术网

C++ 关于成员函数的声明

C++ 关于成员函数的声明,c++,function,abstract-class,definition,member,C++,Function,Abstract Class,Definition,Member,我有一个抽象基类 我有一堆成员函数,它们既不是私有的,也不是静态的,也不是模板,只是普通的公共成员函数 我注意到我有来定义在其他函数的定义中被调用的任何这些公共正常函数,即使这些函数在main中没有被任何代码运行 更吸引我注意的是,在任何情况下,如果类是抽象的,那么如果类本身不以任何方式实例化,为什么要强制定义任何函数呢 这是我在这里发布的第一个问题,如果我没有很好地解释自己或者做错了什么,那么很抱歉 提前感谢您的帮助 这是我所说的课程的一个简短版本: #ifndef PROCESS_H_INC

我有一个抽象基类

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

我注意到我有来定义在其他函数的定义中被调用的任何这些公共正常函数,即使这些函数在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
#如果包含NDEF流程#
#定义包含的过程
#包括
#包括
使用std::弱ptr;
使用std::shared_ptr;
课堂过程;
typedef共享\u ptr shProcess;
typedef弱ptr wProcess;
类进程
{
好友类进程管理器;
公众:
内联void AttachChild(shProcess shChild);
/*
例如,我可以在没有定义的情况下离开上面的函数,但是我有
要定义下面的函数,我会遇到一个编译器错误
可能是因为即使这个类是抽象的,我也把它当作一个
用于多形性目的的其他函数的参数?
*/
shProcess RemoveChild(void){return shProcess();}//依赖子进程的所有权
shProcess PeekChild(void){return m_shChild;}//不释放子进程的所有权
};
#endif//包括过程

您可以通过使用语法
=0
,达到您想要的效果,尽管如此,这是标准的,如

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

如果链接器能够证明它们永远不会被调用,那么您可以只声明函数(而不提供主体)


然而,虚拟函数可能会妨碍这一点,因为编译器必须构建一个vtable(其他一些编译单元可能会从类继承并调用函数),而链接器的任务则要困难得多。

恐怕您的问题很难理解,尤其是部分“我必须定义在其他函数定义中调用的任何这些公共正常函数“。请重新措辞。你能展示一些代码来说明你的意思吗?但是在这种情况下,由于类是抽象的,它的函数无论如何都不会被直接调用,所以我为什么还要定义它们?需要地址,才能放入vtable。不能有指向未定义函数的函数指针,这将导致链接错误。