C++编程题 关于 继承和多态 的

C++编程题 关于 继承和多态 的,第1张

首先你的第一个问题,d.vf2()这里涉及到一个c++的原则,子类有父类的同名函数,如果不是虚函数的话,则会“隐藏”父类的函数,不管参数是否一致,都会隐藏!所以你的dd::vf2(int

i)这个函数就把bb::vf2()隐藏了,因此dd就不会继承这个函数。至于为什么这么设计,以前貌似看某处b.s的丛信访谈,说为了减小出错的几率,以免子类的使用者不小心误使用了父类的函数。

看起来貌似第二个问题和第一个问题是一样的,但是结果却不同,其实你应该去了解下c++的对象模型,你就知道它的运作机理了。

对于虚函数,是动态绑定的,在对象内部有一个虚函数表,表里面是一个个的函数指针,指向当前对象的各个虚函数真正的代码,当你代码执行到调用虚函数那里的时候,会去这个表里面查,然后取出函数指针再调用。

如果是非虚函数,则是静态绑定的,也就是说在编译的时候就已经确定要调用哪个函数!

不管b::vf2、d::vf2、d::vf3都是非虚函数,都会发生静态绑定。

也就是说编译器在编译代码的时候就会决定到底调用凯郑源哪个函数。它怎么决定呢?看类型。如下:

bp->vf2()

//这句话,编译器看到了bp是b*类型的,于是就去找b::vf2()这个盯态函数,找到了于是绑定成功。

d.vf2()

//这句话,编译器看到d是d类型的,于是去找d::vf2()这个函数,由于上面提到的隐藏原则,d不存在这个函数,于是没找到,出错。

dp->vf2()

//这句话,编译器看到dp是d*类型的,去找d::vf2()这个函数,于是同上,找不到,出错。

dp->vf3()//编译器看到dp是d*类型的,于是找d::vf3()这个函数,找到了,于是绑定成功。

分析完这四句编译器的行为,你就明白了吧。

我写这么多,你好歹多加点分吧……

选B的原因如下:

问题1:对象成员的问题

子类Derived中有2个成员b和j,而b是基类Base类型的对象,我们选来分析这个对象成员b

在C++中,我们要使用非默认的构造函数来初始化对象成员(注意:不一定是基类的对象成员,这里介绍的情况适合所有对象成员)则必须使用初始化列表才能实现,比如

class B{public: B(int i){} }

class A{public: B mb}

在上面语句中看起桐仔来没有问题,但是当我们创建类A的对象时,比如A ma就会出错,就会出现类A的对象成员mb没有可用的默认构造函数的错误,原因就是在类A中的对象成员mb是使用的默认构造函数来初始化的,因此要使程序正确,必须把类桥铅A改为如下语句

class A{public B mbA():mb(3){} }

使用初始化列表,调用类B的带有一个参数的构造函数初始化对象成员mb,当数整数3可以替换为任何类型相容的整数变量

问题2:继承的问题

在派生类中调用基类带参数的构造函数的方法:在派生类的构造函数中使用初始化列表的形式就可以调用基类带参数的构造函数初始化基类成员,如B():A(int i){},类B是类A的派生类。

原因如下:

如果派生类没有显示用初始化列表调用基类的构造函数时,这时就会用派生类的构造函数调用基类的默认构造函数,构造完基类后,才会执敏轮好行派生类的构造函数函数体,以保证先执行基类构造函数再执行派生类构造函数的顺序,如果基类没有默认构造函数就会出错。

问题3:类中的普通成员

对于子类Derived中的整型变量成员j,这个不用解释了吧,很简单。

综上所述,所以能满足以上要求的答案只有B

Derived : : Derived (int t) : b(t), Base(t), j(t) { }

第一句b(t)表示使用类Base中还有一个参数的构造函数初始化子类Derived中的对象成员b(注意:这个对象成员不一定非要是基类对象成员),

第二句Base(t)表示调用基类中的带有一个参数的构造函数构造基类部分

第三句j(t)这个不解释,很简单,楼主应该懂。

所以答案A是错误的,因类基类Base没有默认构造函数,在子类中必须显示调用基类的非默认构造函数构造基类部分

答案C是错误的:因为子类中的对象成员b是没有默认的构造函数的,在C中没有明确使用初始化列表调用对象成员的非默认构造函数初始化对象成员b

称案D就错得更明显了:除了有答案A的错误之外,还要加上变量i并不是子类的成员变量的错误,因此变量i轮不到使用子类来初始化。

如果你还不是很理解的话,可以去本人的文库下载专题文现<C++类中的各种成员,嵌套类,友元,this指针专题>和<C++继承,虚函数与多态性专题>,里面有专门介绍,相信其他内容也会给你一些帮助


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12334184.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存