仮想関数の動作の例を見ていきます。このテストコードでは、その動作についていくつか質問があります。仮想関数のシグネチャの不一致とその動作
class A
{
public:
A(int x)
{
cout << "In A Constructor" << endl;
print();
}
~A(){
cout << "In A Destructor" << endl;
delete _val;
}
virtual void print() { cout << "A." << endl; }
private:
char* _val;
};
class B: public A
{
public:
B(int x, int y) : A(x)
{
_dVal = new char[y];
cout << "In B Constructor 1" << endl;
print();
}
B() : A(0)
{
_dVal = new char[1];
cout << "In B Constructor 2" << endl;
print();
}
~B(){
cout << "In B Destructor" << endl;
delete _dVal;
}
void print() { cout << "B" << endl; }
private:
char* _dVal;
};
int main(int argc, char** argv) {
A* p1 = new B();
p1->print();
delete p1;
return 0;
}
出力である:
In A Constructor
A.
In B Constructor 2
B
B
In A Destructor
1)なぜ印刷は、クラスBのために呼ばれるクラスAは、仮想関数として示すのみであり、それは(間接参照によって呼び出されている場合 - > )? 2)コンストラクタが実際に呼び出されている場合、Bのデストラクタが呼び出されないのはなぜですか?
ファンクションが基本クラスで仮想である場合、それはすべての派生クラスでも仮想です。デストラクタの同上。 –
1つにつき1つ質問してください。 –