2017プログラム設計実習のC++部分作業問題まとめ-E:多態と虚関数

9856 ワード

テーマ出所:2017プログラム設計実習のC++部分作業問題まとめ
1、E 01:多態に見える
合計時間制限:1000 msメモリ制限:65536 kB記述プログラム空欄指定出力生成
#include 
using namespace std;
class B { 
    private: 
        int nBVal; 
    public: 
        void Print() 
        { cout << "nBVal="<< nBVal << endl; } 
        void Fun() 
        {cout << "B::Fun" << endl; } 
        B ( int n ) { nBVal = n;} 
};
//          
class D:public B
{
private:
    int nDVal;
public:
    D(int n) :B(3*n),nDVal(n){}
    void Fun()
    {
        cout << "D::Fun" << endl;
    }
    void Print()
    {
        B::Print();
        cout << "nDVal=" << nDVal << endl;
    }
};
//         
int main() { 
    //               virtual,             
    //       virtual,      
    //  mian       
    B * pb; D * pd; 
    D d(4); d.Fun();    //output D::Fun,D Fun  B Fun
    pb = new B(2); 
    pd = new D(8); 
    pb->Fun();          //output B::Fun
    pd->Fun();          //output D::Fun
    pb->Print ();       //output nBVal=2
    pd->Print ();       //output nBVal=24
                        //       nDVal=8
                        //D Print  B Print,     8->24
    pb->Fun();          //output B::Fun     
    pb->Print();        //output nBVal=12,     4->12,      
    return 0;
}

入力無出力D::Fun B::Fun D::Fun nBVal=2 nBVal=24 nDVal=8 B::Fun nBVal=12サンプル入力無サンプル出力D::Fun B::Fun D::Fun nBVal=2 nBVal=24 nDVal=8 B::Fun nBVal=12ソースGuo Wei
2、E 02:FunとDo
合計時間制限:1000 msメモリ制限:65536 kB記述プログラム空欄出力指定結果
#include  
using namespace std;
class A { 
    private: 
    int nVal; 
    public: 
    void Fun() 
    { cout << "A::Fun" << endl; }; 
    void Do() 
    { cout << "A::Do" << endl; } 
}; 
class B:public A { 
    public: 
    virtual void Do() 
    { cout << "B::Do" << endl;} 
}; 
class C:public B { 
    public: 
    void Do( ) 
    { cout <<"C::Do"<void Fun() 
    { cout << "C::Fun" << endl; } 
}; 
//    Call             ,  p            
//Fun      virtual  ,     , B    A Fun, C  B Fun
//Do  A     ,  B, C    ,    C  ,   C Do
//  A::Fun      A  B
//  C::Do      B  C,          B   ,    p 
void Call(
//          
B & p
//          
) { 
    p.Fun(); p.Do(); 
} 
int main() { 
    C c; 
    Call( c); 
    return 0;
}

入力無出力A::Fun C::Doサンプル入力Noneサンプル出力A::Fun C::DoソースGuo Wei
3、E 03:これは何の鬼deleteですか
合計時間制限:1000 msメモリ制限:65536 kB記述プログラム空欄出力指定結果
#include  
using namespace std;
class A 
{ 
public:
    A() { }
//          
    virtual ~A(){ cout << "destructor A" << endl; }
//          
}; 
class B:public A { 
    public: 
    ~B() { cout << "destructor B" << endl; } 
}; 
int main() 
{ 
    //        mian    
    //  A          ,     destructor A
    //      ,  virtual,delete pa ,  pa      B     
    //       ,        A     
    A * pa; 
    pa = new B; 
    delete pa; 
    return 0;
}

入力無出力destructor B destructor Aサンプル入力無サンプル出力destructor B destructor AソースGuo Wei
4、E 04:どうしてまたFunとDo
合計時間制限:1000 msメモリ制限:65536 kB記述プログラム空欄出力指定結果
#include 
using namespace std;
class A {
    private:
    int nVal;
    public:
    void Fun()
    { cout << "A::Fun" << endl; };
    virtual void Do()
    { cout << "A::Do" << endl; }
};
class B:public A {
    public:
    virtual void Do()
    { cout << "B::Do" << endl;}
};
class C:public B {
    public:
    void Do( )
    { cout <<"C::Do"<void Fun()
    { cout << "C::Fun" << endl; }
};
//         ,    p
//Fun  virtual,      , A  B Fun  A::Fun, C Fun  C::Fun
//Do    , A Do  A::Do, B Do  B::Do, C Do  C::Do
void Call(
//          
A * p
//          
) {
    p->Fun(); p->Do();
}
int main() {
    //           ,     ,  Call    A *     
    Call( new A());
    //output A::Fun
    //       A::Do
    Call( new C());
    // output A::Fun,        A * B *
    //       C::Do
    //               ,                     ,    
    //  Call    A *  ,Call         B *,A *   B *  
    return 0;
}

入力出力なしA::Fun A::Do A::Fun C::Doサンプル入力サンプル出力:Fun A::Do A::Fun C::DoソースGuo Wei