C++で虚関数にできない場合

2088 ワード

一般的な虚関数として宣言できないものは、一般関数(非メンバー関数)、静的メンバー関数、インラインメンバー関数、コンストラクション関数、友元関数です.
1、どうしてC++は普通の関数が虚関数であることを支持しないのですか?
一般関数(非メンバー関数)はoverloadのみでoverrideにはできず、虚関数と宣言しても意味がないため、コンパイラはコンパイル時に関数を邦定します.
2、なぜC++はコンストラクション関数が虚関数であることをサポートしないのですか?
この原因は簡単で、主に意味的に考慮されているので、サポートされていません.コンストラクション関数は本来、初期化オブジェクトのメンバーを明確にするために発生するが、virtual functionは主に詳細を完全に理解しなくてもオブジェクトを正しく処理できるようにするためである.また、virtual関数は、異なるタイプのオブジェクトで異なる動作を生成しますが、オブジェクトはまだ生成されていません.virtual関数を使用して、あなたが完了したい動作を完了する方法です.(これが典型的なパラドックスではない)
3、なぜC++はインラインメンバー関数が虚関数であることをサポートしないのですか?
実はとても简単で、あの内连関数はコードの中で直接展开するためで、関数の呼び出しの费用の代価を减らすためで、虚関数は継承した后にオブジェクトが正确に自分の动作を実行するためで、これは统一することはできません.(それに、inline関数はコンパイル時に展開され、虚関数は実行時に動的な邦定関数になる)
4、なぜC++は静的メンバー関数を虚関数としてサポートしないのですか?
これも簡単です.静的メンバー関数はクラスごとに1つのコードしかありません.すべてのオブジェクトがこのコードを共有しています.彼も動的に邦定する必要はありません.
5、どうしてC++は友元関数が虚関数であることを支持しないのですか?
C++は友元関数の継承をサポートしていないため、特性を継承していない関数には虚関数がないという説があります.
1、最上位関数:多態の運行期間行為は虚関数に現れ、虚関数は継承方式によって多態作用を体現し、最上位関数はメンバー関数に属さず、継承できない.
2、コンストラクション関数:(1)コンストラクション関数は継承できないためvirtual関数として宣言できない.
(2)コンストラクション関数は一般的にオブジェクトを初期化するために用いられ,1つのオブジェクトが生成された後にのみマルチステートの役割を果たすが,コンストラクション関数をvirtual関数と宣言すると,オブジェクトが生成されていない場合にマルチステートメカニズムが使用されていると表現されるため,次の例である.
#include <iostream>
using namespace std;
 class B
{
public:
       B() {}
       virtualvoid show()
       {
              cout<<"***"<<endl;
       }
};
class D:public B
{
public:
       D() {}
       voidshow()
       {
              cout<<"==="<<endl;
       }
};
 
int main(void)
{
       B*pb;
       Dd;        //     
       pb=&d;
       pb->show();//     
 
       pb=newD(); //       
       pb->show();//   
       deletepb;
       return0;
}

3

static
関数:継承できません.クラスのみです.
4、友元関数:友元関数はクラスのメンバー関数ではなく、継承できません.
5、inline関数:inline関数とvirtual関数には本質的な違いがあり、inline関数はプログラムがコンパイルされたときに展開され、関数呼び出しでは関数体全体で置き換えられるが、virtual関数は実行期間でどのように呼び出すかを決定することができるので、inline関数体はコンパイル期間メカニズムであり、virtual関数は実行期間メカニズムを体現している.さらに、virtual関数はすべてinline関数ではありません.