cppPrimer学习19th

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 嵌套类 联合体 内部类

原文地址:https://www.cnblogs.com/zongzi10010/p/12822020.html