c++における虚関数と純虚関数の役割と区別
虚関数は、リロードとマルチステートの必要性のために、ベースクラスに定義があります.定義が空であっても、サブクラスではベースクラスのこの関数を書き換えることができます.
純虚関数はベースクラスでは定義されていません.javaのインタフェース関数に似ているサブクラスで実装する必要があります.
かそうかんすう
導入理由:マルチステート特性の使用を容易にするために、ベースクラスで虚関数を定義する必要があることがよくあります.
じゅんかそうかんすう
導入理由:
1、「虚関数」と同じ;2、多くの場合、ベースクラス自体がオブジェクトを生成するのは無理です.例えば、動物は基質としてトラやクジャクなどの子類を派生させることができるが、動物自体がオブジェクトを生成するのは明らかに常識的ではない.
純虚関数はベースクラスが関数体だけを定義し、実現過程がなく、定義方法はvirtual void Eat()=0である.cppで定義しないでください.純虚関数はインタフェースに相当し、直接インスタンスできない場合は、関数定義を実現するために派生クラスが必要である.
ある人は、これらを定義するのに何の役にも立たないと思っているかもしれませんが、私はとても役に立つと思います.例えば、物事の属性を他の人に説明したいのに、自分が実現したくないので、純虚関数として定義することができます.もっとはっきり言ってください.例えばビルを建てて、あなたはボスで、あなたは建築会社にあなたのビルの特性をはっきり説明して、何階、屋上に花園があるなど、建築会社はあなたの方法によって実現することができて、もしあなたがこれらをはっきり言わないならば、建築会社はあなたがビルの特性を必要とすることをよく知らないかもしれません.純粋な需要関数で十分な分業協力ができる.
虚関数と純虚関数の違い
観点1:
クラスで虚関数と宣言すると、この関数は実装され、空実装でも、この関数をサブクラスに再ロードできるようにするための役割を果たします.そうすると、コンパイラは後期バインドを使用してマルチステートに達することができます.
純粋な虚関数はインタフェースにすぎず、関数の宣言にすぎず、サブクラスに残して実現します.
観点2:
虚関数はサブクラスにも再ロードされなくてもよい.しかし、純虚はJavaのインタフェースのようにサブクラスで実現しなければならない.通常、私たちは多くの関数にvirtualを加えるのは良い習慣で、いくつかの性能を犠牲にしましたが、オブジェクト向けの多態性を増加させました.親クラスのこの関数が子クラスの中でその実現を修正しないとは予想しにくいからです.
観点3:
虚関数のクラスは「実作継承」に使用され、インタフェースを継承するとともに親クラスの実装も継承されます.もちろん私たちも自分の実現を完成することができます.純粋な虚関数のクラスは、主に通信プロトコルに使用される「インターフェース継承」に使用されます.インタフェースの統一性に注目し,サブクラスによる完成を実現する.一般に,インターフェースクラスには純粋な虚関数しかない.
観点4:
純粋な虚関数を持つクラスを虚ベースクラスと呼びます.このベースクラスはオブジェクトを直接生成することはできません.継承され、虚関数を書き換えてから使用できます.このようなクラスは抽象クラスとも呼ばれます.虚関数はインタフェースとデフォルトの動作を継承するために純粋な虚関数はインタフェースを継承するだけで、動作は再定義する必要があります.
純虚関数はベースクラスでは定義されていません.javaのインタフェース関数に似ているサブクラスで実装する必要があります.
かそうかんすう
導入理由:マルチステート特性の使用を容易にするために、ベースクラスで虚関数を定義する必要があることがよくあります.
class Cman
{
public:
<span style="white-space:pre"> </span>virtual void Eat(){……};
<span style="white-space:pre"> </span>void Move();
<span style="white-space:pre"> </span>private:
};
class CChild : public CMan
{
public:
<span style="white-space:pre"> </span>virtual void Eat(){……};
private:
};
CMan m_man;
CChild m_child;
CMan *p ;// , ,
p = &m_man ;
p->Eat(); // CMan Eat , CChild
p = &m_child;
p->Eat(); // ( ) , CChild Eat
// CMan Eat ; , CMan Eat
p->Move(); // ,
じゅんかそうかんすう
導入理由:
1、「虚関数」と同じ;2、多くの場合、ベースクラス自体がオブジェクトを生成するのは無理です.例えば、動物は基質としてトラやクジャクなどの子類を派生させることができるが、動物自体がオブジェクトを生成するのは明らかに常識的ではない.
純虚関数はベースクラスが関数体だけを定義し、実現過程がなく、定義方法はvirtual void Eat()=0である.cppで定義しないでください.純虚関数はインタフェースに相当し、直接インスタンスできない場合は、関数定義を実現するために派生クラスが必要である.
ある人は、これらを定義するのに何の役にも立たないと思っているかもしれませんが、私はとても役に立つと思います.例えば、物事の属性を他の人に説明したいのに、自分が実現したくないので、純虚関数として定義することができます.もっとはっきり言ってください.例えばビルを建てて、あなたはボスで、あなたは建築会社にあなたのビルの特性をはっきり説明して、何階、屋上に花園があるなど、建築会社はあなたの方法によって実現することができて、もしあなたがこれらをはっきり言わないならば、建築会社はあなたがビルの特性を必要とすることをよく知らないかもしれません.純粋な需要関数で十分な分業協力ができる.
虚関数と純虚関数の違い
観点1:
クラスで虚関数と宣言すると、この関数は実装され、空実装でも、この関数をサブクラスに再ロードできるようにするための役割を果たします.そうすると、コンパイラは後期バインドを使用してマルチステートに達することができます.
純粋な虚関数はインタフェースにすぎず、関数の宣言にすぎず、サブクラスに残して実現します.
class A{
protected:
<span style="white-space:pre"> </span>void foo();//
<span style="white-space:pre"> </span>virtual void foo1();//
<span style="white-space:pre"> </span>virtual void foo2() = 0;//
}
観点2:
虚関数はサブクラスにも再ロードされなくてもよい.しかし、純虚はJavaのインタフェースのようにサブクラスで実現しなければならない.通常、私たちは多くの関数にvirtualを加えるのは良い習慣で、いくつかの性能を犠牲にしましたが、オブジェクト向けの多態性を増加させました.親クラスのこの関数が子クラスの中でその実現を修正しないとは予想しにくいからです.
観点3:
虚関数のクラスは「実作継承」に使用され、インタフェースを継承するとともに親クラスの実装も継承されます.もちろん私たちも自分の実現を完成することができます.純粋な虚関数のクラスは、主に通信プロトコルに使用される「インターフェース継承」に使用されます.インタフェースの統一性に注目し,サブクラスによる完成を実現する.一般に,インターフェースクラスには純粋な虚関数しかない.
観点4:
純粋な虚関数を持つクラスを虚ベースクラスと呼びます.このベースクラスはオブジェクトを直接生成することはできません.継承され、虚関数を書き換えてから使用できます.このようなクラスは抽象クラスとも呼ばれます.虚関数はインタフェースとデフォルトの動作を継承するために純粋な虚関数はインタフェースを継承するだけで、動作は再定義する必要があります.