C++構造と分析
8513 ワード
コンストラクション関数でダミー関数を呼び出すのは、ベースクラスの関数が派生クラスを呼び出すのではなく、派生クラスがまだ構築されていないためです.コンストラクション関数を簡素化するには、メンバー関数にいくつかの操作を抽出することができます.一般的に、コンストラクション関数で虚関数を呼び出さないでください.
ベースクラスコンストラクタを呼び出すには、初期化リストに置く必要があります.派生クラス関数体に置くと、ベースクラスのコンストラクタが2回呼び出されます.1回目はコンパイラが挿入した呼び出しベースクラスの無パラメトリックコンストラクタです.コンストラクション関数は、コンストラクション関数の呼び出し順序とは逆です.おそらく、派生クラスはベースクラスのデータ仮想コンストラクション関数を使用する可能性があります.ベースクラスポインタを使用して派生クラスオブジェクトをコンストラクションすると、正しいコンストラクション関数を呼び出すことを保証します.次のテストコードが表示されます.
実行結果:
上に述べたいくつかの点は、すべて見ることができるはずです.
さらに、
変数を定義する場合、単一パラメトリック構造関数
Foo apple = 8; Foo apple(8);等価です.
ベースクラスコンストラクタを呼び出すには、初期化リストに置く必要があります.派生クラス関数体に置くと、ベースクラスのコンストラクタが2回呼び出されます.1回目はコンパイラが挿入した呼び出しベースクラスの無パラメトリックコンストラクタです.コンストラクション関数は、コンストラクション関数の呼び出し順序とは逆です.おそらく、派生クラスはベースクラスのデータ仮想コンストラクション関数を使用する可能性があります.ベースクラスポインタを使用して派生クラスオブジェクトをコンストラクションすると、正しいコンストラクション関数を呼び出すことを保証します.次のテストコードが表示されます.
1
class
A{
2
public
:
3
A(){
4
printf(
"
A
"
);
5
f();
6
}
7
virtual
void
f(){
8
printf(
"
A.f()
"
);
9
}
10
virtual
~
A(){
11
printf(
"
A
"
);
12
}
13
};
14
15
class
B:
public
A{
16
public
:
17
B(): A(){
18
printf(
"
B
"
);
19
f();
20
}
21
virtual
void
f(){
22
printf(
"
B.f()
"
);
23
}
24
virtual
~
B(){
25
printf(
"
B
"
);
26
}
27
};
28
29
int
main(){
30
A
*
p
=
new
B();
31
p
->
f();
32
delete p;
33
return
0
;
34
}
実行結果:
[lym@localhost tmp]
$
./
a
.
out
A
A
.
f
()
B
B
.
f
()
B
.
f
()
B
A
上に述べたいくつかの点は、すべて見ることができるはずです.
さらに、
変数を定義する場合、単一パラメトリック構造関数
Foo apple = 8; Foo apple(8);等価です.