chapter 17: 类继承和子类型 心得

    技术2022-05-11  82

    chapter 17: 类继承和子类型现在工作中也用到了比较恶心的方法:例如:void Equal(){switch(class_type){case Student: Student * Stu =static_cast<Student*> (p); Stu->Equal(); break;case Teacher: Teacher * Tea = static_cast<Teacher*> (p); Tea->Equal(); break;default: error;};};

    一个对象的大小是由该类(包含基类和子类)的非静态数据成员决定的。#include <iostream>using namespace std;class base{public:int a;static int s ;};

    int base::s = 0;

    int main(){cout << sizeof(base)<<endl; // -- 4base b;cout << sizoef(b)<<endl;  // --4return 0;};

    如果在子类中设置了和基类一样的数据或者方法成员,则基类的数据或者方法成员会被隐藏。如果确实需要访问基类的数据或者方法成员,则需要使用类域操作符::。如果不被隐藏,那么如果使用者可能在基类和子类中都生成原型一样的函数,导致重复定义。而现在则是隐藏基类的成员。

    p740:定义的基类指针访问的一些限定:1基类指针只能访问在该类中被声明或继承的数据成员和成员函数,包括虚拟成员函数,而与它可能指向的实际对象无关。

    P742: 友元关系是没有继承的。例如:class base{public: friend class delivier;};

    class Sam : public delivier{

    };

    这里Sam就不能访问base的非共有成员。友元关系必须显示继承。

    P744:构造函数的调用顺序总是如下:1 基类构造函数.如果有多个基类,则构造函数的调用顺序是某类在类派生表中出现的顺序,而不是它们在成员初始化表中的顺序.2 成员类对象构造函数.如果有多个成员类对象,则构造函数的调用顺序是对象在类中被声明的顺序,而不是它们出现在成员初始化表中的顺序.3 派生类构造函数.

    P749:一般情况下如此,析构函数与上相反。例外情况:class base{public: base(){}; ~base(){};};

    class deliver: public base{public: deliver() {};~deliver() {};};

    int main(){base* p = new deliver();delete p; //这里只会调用base的析构函数,如果把deliver声明为虚析构函数,则是先deliver的析构函数再调用base的析构return 1;};

    P760:虚拟函数和缺省实参缺省实参的确定是在编译时刻根据被调用函数的对象的类型决定,而不是运行时绝定。可以认为编译时先根据类型,填充缺省参数,再运行时判断实际调用类。换一句话: 虚拟机制不支持根据被调用函数的实际实例而决定缺省参数。

    。。。。。。。。。。。。

    另外知道了struct的初始化方法,比较ex(BC,g++都不行,):struct student{int id;int age;};

    struct student stu = {.id = 0;.age = 0;};


    最新回复(0)