精华内容
下载资源
问答
  • C++ 看上去像多态题解.pdf
  • C++ 看上去像多态的练习题.pdf
  • 023:看上去像多态

    2020-10-22 21:58:45
    023:看上去像多态 题面 描述 程序填空产生指定输出 #include <iostream> using namespace std; class B { private: int nBVal; public: void Print() { cout << "nBVal="<< nBVal &...

    023:看上去像多态

    题面

    描述

    程序填空产生指定输出

    #include <iostream>
    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;} 
    };
    // 在此处补充你的代码
    int main() { 
    	B * pb; D * pd; 
    	D d(4); d.Fun(); 
    	pb = new B(2); pd = new D(8); 
    	pb -> Fun(); pd->Fun(); 
    	pb->Print (); pd->Print (); 
    	pb = & d; pb->Fun(); 
    	pb->Print(); 
    	return 0;
    }
    

    输入

    输出

    D::Fun
    B::Fun
    D::Fun
    nBVal=2
    nBVal=24
    nDVal=8
    B::Fun
    nBVal=12

    思路

    看题时候会很懵,看题解时会明白。

    要是说为什么不是虚函数的话,我们可以看到pb=&d;调用输出的是B::Fun,如果是虚函数那么他输出的应该是D::Fun

    #include <iostream>
    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 Print() {
    		B::Print();
    		cout << "nDVal" << nDVal << endl;
    	}
    	void Fun() {
    		cout << "D::Fun" << endl;
    	}
    };
    
    // 在此处补充你的代码
    int main() {
    	B* pb; D* pd;
    	D d(4); d.Fun();
    	pb = new B(2); pd = new D(8);
    	pb->Fun(); pd->Fun();
    	pb->Print(); pd->Print();
    	pb = &d; pb->Fun();
    	pb->Print();
    	return 0;
    }
    
    展开全文
  • C++ 看上去像多态的练习题

    千次阅读 2018-10-20 20:34:47
    1:看上去像多态 查看 提交 统计 提问 总时间限制:  1000ms   内存限制:  65536kB // 在此处补充你的代码 描述 程序填空产生指定输出 #include &lt;iostream&gt; using namespace std; ...

    1:看上去像多态

    总时间限制: 

    1000ms

     

    内存限制: 

    65536kB

    // 在此处补充你的代码

    描述

    程序填空产生指定输出

    #include <iostream>
    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;} 
    };
    int main() { 
    	B * pb; D * pd; 
    	D d(4); d.Fun(); 
    	pb = new B(2); pd = new D(8); 
    	pb -> Fun(); pd->Fun(); 
    	pb->Print (); pd->Print (); 
    	pb = & d; pb->Fun(); 
    	pb->Print(); 
    	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

     

    从主函数可以看出,除了B类,还有一个D类,公有继承B类,其中Fun和Print两个函数需要重写

    #include <iostream>
    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 nDval_) :nDVal(nDval_),B(3*nDval_){};
    	
    	void Fun()
    	{
    		cout << "D::Fun" << endl;
    	}
    
    	void Print()
    	{
    		B::Print();
    		cout << "nDVal=" << nDVal << endl;
    	}
    
    };
    int main() {
    	B * pb; D * pd;
    	D d(4); d.Fun();
    	pb = new B(2); pd = new D(8);
    	pb->Fun(); pd->Fun();
    	pb->Print(); pd->Print();
    	pb = &d; pb->Fun();
    	pb->Print();
    	return 0;

     

    展开全文
  • 程序设计与算法(三)第06周测验001 看上去像多态 本文是中国大学MOOC,北京大学程序设计与算法(三)C++面向对象程序设计第六周测验。本课程学习的github仓库欢迎Fork 总时间限制: 1000ms 内存限制: 65536kB ...

    程序设计与算法(三)第06周测验001 看上去像多态

    本文是中国大学MOOC,北京大学程序设计与算法(三)C++面向对象程序设计第六周测验。本课程学习的github仓库欢迎Fork

    • 总时间限制:

      1000ms

    • 内存限制:

      65536kB

    • 描述

      程序填空产生指定输出

      #include <iostream>
      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;} 
      };
      // 在此处补充你的代码
      int main() { 
      	B * pb; D * pd; 
      	D d(4); d.Fun(); 
      	pb = new B(2); pd = new D(8); 
      	pb -> Fun(); pd->Fun(); 
      	pb->Print (); pd->Print (); 
      	pb = & d; pb->Fun(); 
      	pb->Print(); 
      	return 0;
      }
      
    • 输入

    • 输出

      D::Fun
      B::Fun
      D::Fun
      nBVal=2
      nBVal=24
      nDVal=8
      B::Fun
      nBVal=12
      

    先看主函数:

    int main() { 
    	B * pb; D * pd; 	//定义了B类对象pb,D类对象pd
    	D d(4); d.Fun(); 	//构造函数D.d()
    	pb = new B(2); pd = new D(8); 	
    	pb -> Fun(); pd->Fun(); 	//函数Fun()
    	pb->Print (); pd->Print (); 	//函数Print()
    	pb = & d; pb->Fun(); 
    	pb->Print(); 
    	return 0;
    }
    

    再看看类定义

    class B { 
    	private: 
    		int nBVal; 
    	public: 
    		void Print() 
    		{ cout << "nBVal="<< nBVal << endl; } 
    		void Fun() 
    		{cout << "B::Fun" << endl; } 
    		B ( int n ) { nBVal = n;} 
    };
    

    所以我们要写一个D类,这个类应该是B类的派生类。因为两个类的函数名都一样。

    再看看输出:

    D::Fun		//d.Fun()输出
    B::Fun		//pb-->Fun()
    D::Fun		//pd-->Fun()
    nBVal=2		//pb-->Print()
    nBVal=24		
    nDVal=8		
    B::Fun		//pb-->Fun()
    nBVal=12	//pb-->Print()
    

    nBVal=24nDVal=8有点迷。

    根据程序执行的顺序与输出对应,我们猜测pd-->Fun()应该会调用一次B类的Print()所以,接下来就清楚了。我们可以这样写。

    class D:public B
    {
    private:
    	int nDVal;
    public:
    
    	void Fun()
    	{
    		cout << "D::Fun" << endl;
    	}
     
    	void Print()
    	{
    		B::Print();
    		cout << "nDVal=" << nDVal << endl;
    	}
     		D(int nDval_) :nDVal(nDval_),B(3*nDval_){};	
    };
    

    提交,通过。

    展开全文
  • 022:看上去像多态

    2021-04-11 09:52:28
    这题还挺有意思的,利用了基类指针能指向派生类成员,但只能访问基类部分数据的这个特点,实际上题目上用基类指针指向派生类对象但又不是多态的做法是错误的,不过郭炜老师的题中这样的题目比比皆是,利用这种...

    题目:

    http://cxsjsxmooc.openjudge.cn/2021t3springall2/022/

    分析:

    这题还挺有意思的,利用了基类指针能指向派生类成员,但只能访问基类部分数据的这个特点,实际上像题目上用基类指针指向派生类对象但又不是多态的做法是错误的,不过郭炜老师的题中这样的题目比比皆是,利用这种“错误”用法去让我们记住这种用法是不正确的。

    参考代码:

    //emmm...大家忽略我山寨的英语注释,因为写代码时切换中英输入法挺麻烦的,顺便还能练习一下哈,大伙凑合凑合。
    #include <iostream>
    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 Print()
        {
            B::Print();
            cout << "nDVal="<< nDVal << endl;
        }
        void Fun()
        {cout << "D::Fun" << endl; }
    };
    
    
    int main() {
        B * pb; D * pd; //define derived class D form B
        D d(4); d.Fun(); //define cover function Fun() of class D
        pb = new B(2); pd = new D(8);//class D's construction function
        pb -> Fun(); pd->Fun();
        pb->Print (); pd->Print (); //define cover function Print() of class D
        //according to the output, B.Print() will print "nBVal=24" and  "nDVal=8"
        pb = & d; //Decided that class D must form B
        //the class D derived from class B, so pointer pb can point to variable d(class D)
        //but int that time pb just can visit the elements from class B of class D.
        //we can change the nBVal in class D only in initialization.
        pb->Fun();
        pb->Print();
        return 0;
    }

     

    展开全文
  • 这道题太好了,原来我以为就是一道脑洞题,后来发现实际上这道题在考察我们是否能分清多态和非多态语句。我就没分清,又重新搞明白了 #include <iostream> using namespace std; class B { private: int ...
  • C++ 看上去像多态题解

    2018-12-19 23:44:37
    这个不是多态,只是简单的继承,需要逐行调试程序 #include using namespace std; class B { private: int nBVal; public: void Print() { cout ; } void Fun() { cout ; } B(int n) { nBVal = n...
  • 001:看上去像多态 描述 程序填空产生指定输出 #include <iostream> using namespace std; class B { private: int nBVal; public: void Print() { cout << "nBVal="<< nBVal <<...
  • 北大程序设计与算法(三)测验题汇总(2020春季) 描述 程序填空产生指定输出 #include <iostream> using namespace std; class B { private: int nBVal; public: void Print() ... ...
  • 023:看上去像多态 #include <iostream> using namespace std; class B { private: int nBVal; public: void Print() { cout << "nBVal="<< nBVal << endl; } void Fun() ...
  • 文章目录原题题目代码实现 原题题目 #include <iostream> using namespace std; class B { private: int nBVal; public: void Print() { cout << "nBVal="<... B ( int

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,905
精华内容 5,562
关键字:

看上去像多态