第十八章 18.3.3节练习

来源:互联网 发布:淘宝赚佣金方法 编辑:程序博客网 时间:2024/05/24 04:55
struct Base1{  void print(int) const;protected:  int ival;  double dval;  char cval;private:  int *id;};struct Base2{  void print(double) const;protected:  double fval;private:  double dval;};struct Derived : public Base1{  void print(std::string) const;protected:  std::string sval;  double dval;};struct MI:public Derived, public Base2{  void print(std::vector<double>);protected:  int *ival;  std::vector<double> dvec;};


练习18.26

已知如上所示的继承体系,下面对print的调用为什么是错误的?适当修改MI,令其对print的调用可以编译通过并正确执行。

MI mi;

mi.print(42);

解答:

很明显,42不能匹配vector<double>类型。

gcc 4.9.1

note:   no known conversion for argument 1 from ‘int’ to ‘std::vector<double>’
clang 3.4

error: no viable conversion from 'int' to 'std::vector<double>'

修改一下MI:

struct MI:public Derived, public Base2{  using Base2::print;  void print(std::vector<double>);protected:  int *ival;  std::vector<double> dvec;};
这样是使用继承类Base2中的print(double)的。

如果想要使用Base1中print(int), 可以把using语句改为 using Base1::print;


练习18.27

已知如上所示的继承体系,同时假定为MI添加一个名为foo的函数:

int ival;

double dval;

void MI::foo(double cval){

  int dval;

  //练习中的问题发生在此处

}

(a) 列出在MI::foo中可见的所有名字。

(b) 是否存在某个可见的名字是继承自多个基类?

(c) 将Base1的dval成员与Derived的dval成员求和后赋给dval的局部实例。

(d) 将MI::devc的最后一个元素的值赋给Base2::fval。

(e) 将从Base1继承的cval赋给从Derived继承的sval的第一个字符。

解答:

(a)

函数局部变量:double cval; int dval;

MI成员变量:int *ival; vector<double> dvec;

Base2成员变量:double fval;

Derived成员变量:string sval;

其他同名的变量都被隐藏了。

(b)

这个是不行的,可见的名字只能继承自某一个基类。

在不同的基类中,相同名字的变量可能类型是不同的,这样会在后面程序中产生二义性。

所以继承的可见变量是与继承基类是一一对应的。

(c)

void MI::foo(double cval){  int dval;  dval = Base1::dval + Derived::dval;}

(d)

void MI::foo(double cval){  int dval;  auto it = dvec.rbegin();  Base2::fval = *it;}

(e)

void MI::foo(double cval){  int dval;  Derived::sval[0] = Base1::cval;}

0 0
原创粉丝点击