C++で虚関数として宣言できない関数


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

private:
};
class D :public B{
public:
	D() {
		cout << "     " << endl;
	}
	~D() {
		cout << "     " << endl;
	}
	void func() {
		cout << "    func()" << endl;
	}

private:
};
int main(int argc, char **argv) {

	D d; //        
	B*p = &d;
	p->func(); //       
	p = new D(); //     
	p->func(); //       
	delete p;
	return 0;
}