0

抽象基本クラスがあります。

プライベートでも静的でもテンプレートでもない、通常のパブリックメンバー関数だけのメンバー関数がたくさんあります。

そして、これらの関数がメインのコードによって実行されていない場合でも、他の関数の定義で呼び出されているこれらのパブリック通常関数を定義する必要あることに気付きました。

さらに私の注意を引くのは、クラスが抽象的である場合、クラス自体がインスタンス化されない場合、実際に関数を強制的に定義する必要があるのはなぜですか??

これは私がここに投稿する最初の質問です。うまく説明できなかったり、何か間違ったことをしている場合は申し訳ありません。

よろしくお願いします。

これは、私が話しているクラスの短縮版です。

#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
4

2 に答える 2

1

関数が呼び出されないことをリンカーが証明できる場合は、関数を宣言するだけで (本体を提供せずに) 回避できます。

ただし、コンパイラは vtable を作成する必要があり (他のコンパイル ユニットがクラスから継承して関数を呼び出す可能性があります)、リンカーのタスクははるかに困難になるため、仮想関数がこれを妨げる可能性があります。

于 2012-08-04T13:09:05.427 に答える
0

次のように、好奇心旺盛ですが標準的な構文を使用して、必要な効果を得ることができます= 0

class T {
    // ...
  public:
    virtual int foo() = 0;
};
于 2012-08-04T13:08:20.223 に答える