cppPrimer学习19th
19.3
已知存在如下的类继承体系,其中每个类分别定义了一个公有的默认构造函数和一个析构函数:
class A { /* ... */};
class B : public A { /* ... */};
class C : public B { /* ... */};
class D : public B, public A { /* ... */};
下面哪个 dynamic_cast 将失败?
(a) A *pa = new C;
B *pb = dynamic_cast<B*>(pa); ok
(b) B *pb = new B;
C *pc = dynamic_cast<C*>(pb); 错误,内存本身就是基类的
(c) A *pa = new D; D里面有两个A,无法转换
B *pb = dynamic_cast<B*>(pa);
19.4
使用上一个练习定义的类改写下面的代码,将表达式*pa 转换成类型C&:
if (C *pc = dynamic_cast<C*>(pa))
{
//使用C的成员
pc->....
} else {
//使用A的成员
pa->...
}
A *pa = new C;
..接下去就正常使用了
19.5
在什么情况下你应该用 dynamic_cast 替代虚函数?
基类的指针,但是实际内存是子类的,并且没有虚函数
19.6
编写一条表达式将 Query_base 指针动态转换为 AndQuery 指针。
分别使用 AndQuery 的对象以及其他类型的对象测试转换是否有效。
打印一条表示类型转换是否成功的信息,确保实际输出的结果与期望的一致
https://blog.csdn.net/shamozhizhoutx/article/details/90490237
19.8
if(typeid(*pa1) == typeid(*pa2))
19.9
// 编写与本节最后一个程序类似的代码,令其打印你的编译器为一些常见类型所起的名字。如果你得到的输出结果与本书类似,尝试编写一个函数将这些字符串翻译成人们更容易读懂的形式。
19.10
//已知存在如下的类继承体系,其中每个类定义了一个默认公有的构造函数和一个虚析构函数。
// 下面的语句将打印哪些类型名字?
#include <iostream>
#include <typeinfo>
using namespace std;
class A
{
};
class B : public A
{
};
class C : public B
{
};
int main(int argc, char const *argv[])
{
{
A *pa = new C; //A类型指针 P1A
cout << typeid(pa).name() << endl;
}
{
C cobj;
A &ra = cobj;
cout << typeid(&ra).name() << endl; //A类型指针 P1A
}
{
B *px = new B;
A &ra = *px;
cout << typeid(ra).name() << endl; // A类型 1A
}
while (1)
;
return 0;
}
19.11
普通的数据指针和指向数据成员的指针有何区别?
普通的数据指针指向对象
成员指针指向非静态类成员,初始化指针是只是指向成员,在使用时指定对象,
同时定义时需要 提供类名 classname::*pt
19.12
定义一个成员指针,令其可以指向 Screen 类的 cursor 成员。通过该指针获得 Screen::cursor 的值。
pos cursor = 0;
public:
Screen::pos Screen::*getpos(){
return &Screen::cursor;
}
main
{
Screen myScreen(2, 2, 'c');
const Screen::pos Screen::*pcursor = Screen::pcursor();
auto i = myScreen.*pcursor;
}
19.14
下面的代码合法吗?如果合法,代码的含义是什么?如果不合法,解释原因。
auto pmf = &Screen::get_cursor;
pmf = &Screen::get; // 两个函数返回值不一样
19.15
普通函数指针和指向成员函数的指针有何区别?
1.在成员函数和指向该成员的指针之间不存在自动转换规则 函数名不能直接赋值,要使用 &classname::fun;
2.使用的时候才指定具体对象
19.16
声明一个类型别名,令其作为指向 Sales_data 的 avg_price 成员的指针的同义词。
using AvgPrice = double (Sales_data::*)() const;
AvgPrice avgprice = &Sales_data::avg_price;
19.17
为 Screen 的所有成员函数类型各定义一个类型别名。
略 https://blog.csdn.net/shamozhizhoutx/article/details/90490237
19.18
编写一个函数,使用 count_if 统计在给定的 vector 中有多少个空 string。
std::function<bool (const std::string&)> fcn = &std::string::empty;
std::count_if(vs.begin(), vs.end(), fcn)
Tudo 嵌套类 联合体 内部类