classPerson{public:virtual~Person();voidfeed(Animal&ani){//1ani.eat(fetchFood());//2}private://3virtualFood&fetchFood();//4};根据上边给出的类定义,分析设计者的意图,那么说法正确的是:
A. feed的过程是固定的,但不同的Animal有不同的Food
B. Person类的子类也会有feed行为,应该给//1添加virtual关键字
C. Person类的子类也会有feed行为,但行为过程与Person是一样的,所以可以在//1和//4中任意选一个添加virtual关键字即可
D. Person类的子类会有不同的fetchFood,导致feed的行为过程一致,但行为结果可能完全不同
查看答案
已知Parent类及其子类Child1,Child2的定义如下:class Parent {public:virtual ~Parent( ) { }virtual void f( ) = 0 ;};class Child1:public Parent {public:virtual ~Child1( ) { }virtual void f( ){g( );}int g( ) { /*略 */ }};class Child2:public Parent {public:virtual ~Child2( ) { }virtual void f( ){ k( );}private:void k( ) { /*略*/}};下面的代码,哪个无法体现多态性的应用价值:
A. class A {public:virtual ~A( ) { }voiduserParent( Parent * pparent) { if(pparent) pparent->f( ); }};
B. class A {public:virtual ~A( ) { }voiduserParent( Parent & parent) { parent.f( ); }};
C. class A {public:virtual ~A( ) { }voiduserParent( ) { mparent.f( ); }private:Parent mparent;};
D. class A {public:virtual ~A( ) { }voiduserParent( ) { if(mpprent) mpparent->f( ); }private:Parent * mpparent;};
已有如下类定义:class Person {public:static Male createMale( );static Femle createFemle( );virtual ~Person( );};class Male:public Person {};class Female:public Person{};如果希望用类似的方式定义其它类,那么下面最合适的是:
A. 颜色-黑-白
B. 方向-左-右
C. 孩子-老大-老二-老三
D. 三角形的角-钝角-直角-锐角
描述老鼠吃水果。如果不同种类的老鼠吃不同种类的水果,有不一样的行为,例如:大老鼠吃苹果,洗完苹果后,再吃;小老鼠吃苹果,直接不吃,放弃;大老鼠吃香蕉,连皮带瓤都吃;小老鼠吃香蕉,只吃瓤;等等。那么在下面哪种情况下,只通过简单地继承和虚函数是无法适应上述要求的?
A. 老鼠只有一种,水果有香蕉和苹果两种,且香蕉只有一种,但苹果有多种
B. 老鼠只有一种,水果有香蕉、苹果等多种,但每种水果至多只有一个对象
C. 水果只有一种,老鼠有大老鼠、小老鼠等多种,但每种老鼠的最大数量限定为5个
D. 水果有多种,老鼠有大老鼠、小老鼠等多种,但每种老鼠至多只有一个对象
既然类有缺省的拷贝构造函数,那么定义虚拟拷贝构造函数一定有其特殊的目的和作用。下面的说法错误的是:
A. 拷贝构造子类对象时,使用普通拷贝构造函数必须明确指明类名,而使用虚拟拷贝构造函数则不必知道类名
B. 使用普通拷贝构造函数,拷贝不同类型的对象需要不同的访问接口,而使用虚拟拷贝构造函数,可以用一致的接口拷贝对象
C. 虚拟拷贝构造函数要求父类和子类都有一致的拷贝接口(如clone函数),但各子类的其它接口函数是可以不同的
D. 子类中定义了虚拟拷贝构造函数,那么应该禁用这个子类的拷贝构造函数,如可使用形如 SubClass(const SubClass&) = delete;的语句