《C++ Primer 4 Answer Book》 整理[14]——第15章 面向对象编程

本文深入探讨面向对象编程的核心概念,包括虚成员函数的定义、构造函数的正确使用、虚析构函数的重要性及其应用场景等。同时解析了多个示例代码中的错误,并提供了相应的修正建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

15    面向对象编程

         10615.1哪些成员函数可以定义为虚成员?

         答:除了构造函数外,任意非static成员函数都可以为虚成员;

 

         10715.16对于下面的基类定义:      

                   structBase{

                            Base(intval):id(val){}

                   protected:

                            intid;

                   }

                   解释为什么下述每个构造函数是非法的。

                   a)struct C1:public Base{

                            C1(intval):id(val){}

                     };

                   没有在初始化列表中向基类构造函数传递实参;

                   b)struct C2:public C1{

                            C2(intval):Base(val),C1(val){}

                     };

                   初始化列表中出现了非直接基类Base

                   c)struct C3:public C1{

                            C3(intval):Base(val){}

                     };

                   初始化列表中出现了非直接基类Base而没有出现直接基类C1

                   d)structC4:public Base{

                            C4(intval):Base(id+val){}

                     };

                   初始化列表中使用了未定义的变量id

                   e)struct C5:public Base{

                            C5(){}

                      };         

                   缺少初始化列表:Base类没有默认构造函数,其派生类必须用初始化列表的构造函数传递实参;

        

         10815.17说明在什么情况下类应该具有虚析构函数?

         答:作为基类使用的类应该具有析构函数,以保证在删除(指向动态分配对象的)基类指针时,根据指针实际指向的对象所属的类型运行适当的析构函数。

        

         10915.23对于下面的基类和派生类定义:

                   structBase{

                            foo(int);

                   protected:

                            intbar;

                            doublefoo_bar;

                   };

                   structDerived:public Base{

                            foo(string);

                            boolbar(Base *pb);

                            voidfoobar();

                   protected:

                            stringbar;

                   };

         找出下述每个例子中的错误并说明怎样改正:

         a)Derivedd;d.foo(1024);

         调用foo函数所给定的实参类型错误。通过Derived类对象d调用foo函数,调用到的是Derived类中定义的foo函数,应使用string类型的实参。

         b)voidDerived::foobar(){ bar =1024;}

         int型值1024bar进行赋值错误。在Derived类中定义的数据成员bar屏蔽了基类Base中的同名成员,所以此处访问到的是Derived类中定义的bar,应赋以string类型的对象或C风格字符串。

         c)boolDerived::bar(Base *pb)

                   {return foo_bar==pb->foo_bar;}

         通过指向Base类对象的指针访问其受保护成员foo_bar错误。可改正为将pb定义为指向Derived类对象的指针。

        

         11015.25假定Derived继承Base,并且Base将下面的函数定义为虚函数;假定Derived打算定义自己的这个虚函数版本,确定在Derived中哪个声明是错误的,并指出为什么错。

         a)Base*Base::copy(Base*);

           Base* Derived::copy(Derived*);

                  单纯从语法上看并没有错,但Derived中声明的copy是一个非虚函数,而不是对Base中声明的虚函数copy的重定义,因为派生类中重定义了的虚函数必须具有与基类中虚函数相同的原型(唯一的例外是返回类型可以稍有不同)。而且Derived中定义的copy函数还屏蔽了基类Basecopy函数。

         b)Base*Base::copy(Base*);

           Derived* Derived::copy(Base*);

         c)ostream&Base::print(int,ostream&=cout);

           ostream&Derived::print(int,ostream&);

         d)voidBase::eval() const;

           void Derived::eval();

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值