存档

文章标签 ‘析构函数’

【笔记迁移】C++Primer笔记 2010/9/12

2012年2月27日  1,705 views 没有评论

C++Primer笔记 2010/9/12


15章面向对象编程


继承和构造函数:在派生类的构造函数中不能通过初始化列表直接初始化继承成员的值,但是可以在初始化列表中包含基类的构造函数来初始化基类对象。派生类构造函数总是默认的先执行基类的构造函数然后再执行派生类的初始化列表,然后是派生类构造函数函数体。 在多重继承中,派生类只能初始化直接基类,因为直接基类对它的基类已经有了处理,所以派生类只需要对自己的直接基类进行初始化就可以了。
继承, 构造函数


继承和复制控制:派生类和基类的复制控制是分开的,当使用默认的复制控制函数的时候,首先调用基类的默认复制构造函数,然后调用派生类的复制构造函数。但是一旦派生类定义了自己的复制构造函数,那么该定义将完全覆盖默认定义,在此复制构造函数中必须显式调用基类的复制构造函数,否则将会调用基类的默认构造函数对基类对象进行初始化,这会出现令人难以理解的配置:它的基类部分将保存默认值,它的自有成员部分将是另一对象的副本。

示例:

class base{};
class child : public base{
    child(const child& d):base(d)/* other member initialization */{}
}

继承, 复制构制造函数


继承和赋值操作符:赋值操作符必须防止自身赋值,这是首先要注意的。如果派生类显式定义了自己的赋值操作符,那么必须显式调用基类的赋值操作符来为基类对象赋值。
继承, 赋值操作符


继承和析构函数:派生类不需要注意基类的析构函数,编译器总是显示调用派生类对象的基类部分的析构函数,调用顺序与构造顺序相反。
继承, 析构函数


虚析构函数:为了能够在删除动态绑定指针时调用正确的析构函数,可以将基类的析构函数设为虚函数,这样删除时将调用动态绑定的真实对象的析构函数。基类析构函数几乎总是需要定
义为虚析构函数。而且虚析构函数和其他析构函数一样,如果层次中根类的析构函数为虚函数那么派生类的析构函数也将是虚函数,无论是否有显式定义。

析构函数, 虚函数


局部作用域中声明的函数不会重载全局作用域中定义的函数,派生类中定义的函数也不重载基类中定义的成员。所以说重载只会发生在同级作用域中,是一种横向操作。
如果不在派生类中定义此函数,那么可以使用派生类对象调用所有基类中此函数的重载版本,但是如果在派生类中定义了此函数名的函数,不管函数原型是否相同,都无法再通过派生类对象访问这些重载版本了。如果派生类希望使用自己定义的一个版本的此函数,同时又使用基类所定义的所有重载版本(这些版本的函数,函数原型各不相同)那么要么在派生类中重新定义所有的重载版本,要么为重载成员提供using声明。一个using声明只能指定一个名字,不带形参表。例如:在派生类中添加using base::out;就可以在派生类中重载基类的out成员了。

重载, 作用域, using