C++の静的バインディングと動的バインディング
10646 ワード
静的タイプ:オブジェクトが宣言時に使用するタイプで、コンパイル期間が確定しています.動的タイプ:通常は、実行期間によって決定されるポインタまたは現在指定されているオブジェクトを参照するタイプを指します.静的バインド:バインドされているのは静的タイプで、対応する関数または属性はオブジェクトの静的タイプに依存し、コンパイル期間に発生します.動的バインド:ダイナミックタイプがバインドされ、対応する関数または属性はオブジェクトのダイナミックタイプに依存し、実行期間に発生します.
1、
実行結果
2、
実行結果
3、
実行結果
注意:この例ではpB->vfun()はサブクラスD::vfun()関数を呼び出しますが、デフォルトパラメータiで使用される確かなベースクラスiのデフォルト値10です.これは論理的な混乱をもたらした.
ここでは、継承されたvirtual関数のデフォルトパラメータ値を絶対に再定義しないことを推奨します.デフォルトパラメータ値は静的バインド(効率を実行するため)であり、virtual関数は動的バインドであるためです.
参照先:https://www.cnblogs.com/AndyJee/p/4575670.html https://www.cnblogs.com/lizhenghn/p/3657717.html
1、
class B{
public:
void vfun(int i=10)
{
qDebug() << "B:" << i;
}
};
class D: public B{
public:
void vfun(int i=20)
{
qDebug() << "D:" << i;
}
};
int main(int argc, char *argv[])
{
D* pD=new D(); // pD D*, D*
B* pB=pD; // pB B*, pB pD D*
pD->vfun(); //pD 、 D*, D::vfun();
pB->vfun(); //pB B*, , B::vfun();
}
実行結果
D: 20
B: 10
2、
class B{
public:
virtual void vfun(int i=10)
{
qDebug() << "B:" << i;
}
};
class D: public B{
};
int main(int argc, char *argv[])
{
D* pD=new D(); // pD D*, D*
B* pB=pD; // pB B*, pB pD D*
pD->vfun(); //pD 、 D*, D vfun() , vfun() 。
pB->vfun(); //pB B*, B vfun() virtual。 , , B::vfun() 。
}
実行結果
B: 10
B: 10
3、
class B{
public:
virtual void vfun(int i=10)
{
qDebug() << "B:" << i;
}
};
class D: public B{
virtual void vfun(int i=20)
{
qDebug() << "B:" << i;
}
};
int main(int argc, char *argv[])
{
D* pD=new D(); // pD D*, D*
B* pB=pD; // pB B*, pB pD D*
pD->vfun(); //pD 、 D*, D::vfun()
pB->vfun(); //pB B*, B vfun() virtual。 , D::vfun()
}
実行結果
D: 20
D: 10
注意:この例ではpB->vfun()はサブクラスD::vfun()関数を呼び出しますが、デフォルトパラメータiで使用される確かなベースクラスiのデフォルト値10です.これは論理的な混乱をもたらした.
ここでは、継承されたvirtual関数のデフォルトパラメータ値を絶対に再定義しないことを推奨します.デフォルトパラメータ値は静的バインド(効率を実行するため)であり、virtual関数は動的バインドであるためです.
参照先:https://www.cnblogs.com/AndyJee/p/4575670.html https://www.cnblogs.com/lizhenghn/p/3657717.html