第十八章 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;}
- 第十八章 18.3.3节练习
- 第十八章 18.3.1节练习
- 第十八章 18.3.2节练习
- 第十八章 18.3.4节练习
- 第十八章 18.3.5节练习
- 第十八章 18.2.3节练习
- 第十八章 18.1.3节练习 & 18.1.4节练习
- 第十八章 18.1.1节练习
- 第十八章 18.1.2节练习
- 第十八章 18.1.5节练习
- 第十八章 18.2.1节练习
- 第十八章 18.2.2节练习
- 第十八章 18.2.4节练习
- 第十八章练习一:稀疏数组
- c++primer第五版第十八章练习
- 第十八章,对象及对象指针的练习(C++)
- 第十八章
- 第十八章
- 解决MSSQL 2008不能用IP登录的问题
- ASP水晶报表
- MAC环境下PHPStorm配置
- nginx介绍(一) 简介篇
- ORA-01109:数据库无法启动问题
- 第十八章 18.3.3节练习
- android 浏览器夜间模式
- 爱上一个天使的缺点 用一种魔鬼的语言
- flash全屏显示和退出代码
- 8个月从CS菜鸟到拿到Google Offer的经历
- 100!的前100位
- strcpy(), memcpy(), memmove(), memset()原型及应用
- nginx介绍(二) 架构篇
- 数据库表的命名规范