高分网 > 答案大全 > 其它答案 >

c++知识点面向对象(2)

时间: 炎婷2 其它答案

  4 、虚函数

  1)引用或指针的静态类型与动态类型不同这一事实正是C++语言支持多态性的根本所在。

  2)基类中的虚函数在派生类中隐含地也是一个虚函数。当派生类覆盖了某个虚函数时,该函数在基类中的形参必须与派生类中的形参严格匹配。

  3)可以是函数的形参表后加override说明函数是派生类中的虚函数,而用final用于说明不希望在继承类中覆盖该函数。

  4)如果一个派生类虚函数需要调用它的基类版本,但是没有使用作用域运算符,则在运行时该调用将被解析为对派生类版本自身的调用,从而导致无限递归。

  double undiscounted = baseP->Quote::net_price(42);

  5)如果我们通过基类的引用或指针调用函数,则使用基类中定义的默认实参,即使实际运行的是派生类中的函数版本也是如此。

  5 、抽象基类

  1)在虚函数的形参表后加=0会让虚函数变为纯虚函数,纯虚函数本身不需要定义,它只是为派生类提供一个接口用于表示抽象普适的意义。值得注意的是,我们也可以为纯虚函数提供定义,不过函数体必须定义在类的外部。

  2)含有(或者未经覆盖直接继承)纯虚函数的类是抽象基类。抽象基类负责定义接口,而后续的其他类可以覆盖该接口。我们不能定义一个抽象基类的对象。

  3)派生类构造函数只初始化它的直接基类。

  6、 继承情况下的类作用域

  1)名字的查找发生在编译阶段,也就是说不论是对象,指针还是引用,都只能访问它们静态类型的成员。

  2)当派生类中定义了同基类同名的成员时,基类中的成员将会被屏蔽,当然可以使用作用域操作符进行访问。

  3)在派生类中定义的同名函数,就算形参不一样,也会被屏蔽。原理同:局部作用域定义的函数不会重载全局作用域中定义的函数。

  4)如果想让派生类使用所有的重载成员,则在派生类里要么不定义,要么全定义。

  7 、构造函数与复制控制

  因为派生类中实际上包含了基类的一些成员,所以这将会影响到派生类的构造、复制、移动、赋值和撤销。

  7.1 构造函数与继承

  构造函数与复制控制成员不能继承,每个类都必须有自己的构造函数和复制控制成员。

  但是在C++11中,派生类能够和其直接基类定义的构造函数,但是也仅限于此,仍然不能继承默认、拷贝和移动构造函数。

  派生类继承基类构造函数的方式是提供一条注明了基类名的using声明语句,这样对于基类的每个构造函数,编译器都生成一个与之对应的派生类的构造函数。

  class Bulk_qute : public Disc_quote{

  public:

  using Disc_quote::Disc_quote; // 继承Disc_quote的构造函数

  double net_price(size_t) const;

  };

  如果派生类定义的构造函数与基类构造函数具有相同的参数列表,则该构造函数将不会被继承。

  7.2 基类的构造与复制控制函数

  基类的构造与复制函数基本不受影响,唯一的影响是,在确定哪些构造函数时,需要考虑使用对象,可以在构造函数前加protected,让它只能在派生类中使用。

  7.3派生类的构造函数

  1)合成的派生类默认构造函数

  两个步骤:1,调用基类的默认构成函数完成基类成员的初始化;2,用常规变量初始化规则初始化派生类的特有成员。

  2)定义默认构造函数

  可以只给派生类的特有成员赋初值,而函数会隐式调用基类的构造函数对基类成员进行定义。

  3)向基类构造函数传递实参

  派生类的构造函数初始化列表,不能直接初始化派生得到的成员,只能将基类包含在初始化列表中来间接初始化那些成员。

  Bulk_item(const string& book, double sales_price, size_t qty = 0, double disc_rate = 0) : Item_base(book, sales_price), min_qty(qty), discount(dis_rate){}

  4)只能初始化直接基类

  在有多重继承的性况下,派生类的构造函数只能初始化自己的直接基类。

  5)尊重基类接口

  虽然可以在派生类的构造函数体中直接访问基类的public和protected成员,从而进行初始化,但是不要这样做,而是使用基类提供的构造函数接口。

  7.3 复制控制和继承

  7.3.1 定义派生类的复制构造函数

  如果派生类显式定义了自己的复制构造函数或赋值操作符,则该定义将完全覆盖默认定义。基类的部分也必须由派生类定义的函数来完成,不能希望有隐式的复制和赋值(这一点与构造函数不同)。

  在派生类复制构造函数中,会显式的调用基类的复制构造函数,因为它的形参是基类类型的引用,所以可以直接将派生类对象作为实参传入。

  如果没有显式调用,那么将会隐式地调用基类的默认构造函数完成基类部分成员的定义,这样最终得到的派生类对象就很奇怪了。

  7.3.2 派生类赋值操作符

  与复制构造函数类似,必须显式地调用基类的基类的赋值函数。

  7.3.3 派生类的析构函数

  派生类析构函数不负责撤销基类对象的成员。编译器总是显式调用派生类对象基类部分的析构函数。每个析构函数只负责清除自己的成员。

  7.3.4 虚析构函数

  Item_base *itemP = new Item_base;

  delete itemP;

  itemP = new Bulk_item;

  delete itemP;

  上面代码中,在delete指向类的指针时,将调用析构函数,可是这里itemP可能指向基类也可能指向派生类,所以这时候应该在运行阶段根据类型去调用不同的析构函数。

  所以基类的析构函数为虚函数:virtual ~Item_base(){}

  7.3.5 在构造函数和析构函数中调用虚函数

  运行的是为构造函数或析构函数自身类型定义的版本。

  看了“c++知识点面向对象”的还看了:

1.c++程序设计心得体会3篇

2.java实习报告范文3篇

3.电大本科毕业论文范文

4.有关计算机毕业论文

5.“现代通信网”教学体系改革及考试评价论文

51841