专业编程基础技术教程

网站首页 > 基础教程 正文

C++面向对象(4) c++面向对象程序设计第三版答案谭浩强

ccvgpt 2024-11-12 09:55:01 基础教程 48 ℃

纯虚函数能实例化吗,为什么?派生类要实现吗,为什么?

  • 纯虚函数不可以实例化,但可以用其派生类实例化
  • 虚函数的原理采用vtable。类中含有纯虚函数时,其vtable不完全,有个空位。

纯虚函数在类vtable表中对应的表项被赋值为0。即,指向一个不存在的函数。由于编译器不允许调用一个不存在的函数,所以该类不能生成对象。它在派生类中,除非重写该函数,否则也不能生成对象。所以,纯虚函数不能实例化。

  • 纯虚函数是在基类中声明的虚函数,它要求任何派生类都要定义自己的实现方法,以实现多态性。
  • 定义纯虚函数是为了实现一个接口,用来规范派生类行为。所以类纯虚函数的声明就是在告诉子类的设计者,“你必须提供一个纯虚函数的实现,但我不知道你会怎样实现它”

C++中虚函数与纯虚函数的区别

  • 虚函数和纯虚函数可以定义在同一个类中。含有纯虚函数的类称为抽象类,只含有虚函数的类不能称为抽象类。
  • 虚函数可以被直接使用,也可以被子类重载,以多态形式调用;纯虚函数必须在子类中实现函数才可以调用,因为纯虚函数在基类只有声明没有定义。
  • 虚函数和纯虚函数都可以在子类中被重载,以多态的形式被调用。
  • 虚函数和纯虚函数通常存在于抽象基类之中,被继承的子类重载,目的是提供一个统一的接口。
  • 虚函数的定义形式:virtual{};纯虚函数的定义形式:virtual { } = 0;在虚函数和纯虚函数的定义中不能有static标识符,被static修饰的函数在编译时要求前期绑定,然而虚函数却是动态绑定,而且被两者修饰的函数生命周期也不一样。

C++ 中什么是菱形继承问题,如何解决


C++面向对象(4) c++面向对象程序设计第三版答案谭浩强

  • B类和C类都继承A,D类通过多重继承继承了B类和C类。因为上述图表的形状类似于菱形,因此这个问题被形象地称为菱形继承问题。
/*  *Animal类对应于图表的类A* */ class Animal { /* ... */ }; // 基类 {     int weight;      public:     int getWeight() { return weight; } };  class Tiger : public Animal { /* ... */ }; class Lion : public Animal { /* ... */ } class Liger : public Tiger, public Lion { /* ... */ }

菱形继承结构会出现的问题:

  int main( )  {   Liger lg;   /*编译错误,下面的代码不会被任何C++编译器通过 */   int weight = lg.getWeight();    }
  • 在菱形继承结构中,我们可以看出Tiger和Lion类都继承自Animal基类。所以问题是:因为Liger多重继承了Tiger和Lion类,因此Liger类会有两份Animal类的成员(数据和方法),Liger对象"lg"会包含Animal基类的两个子对象

解决方案:

如果Lion类和Tiger类在分别继承Animal类时都用virtual来标注,对于每一个Liger对象,C++会保证只有一个Animal类的子对象会被创建。

class Tiger : virtual public Animal { /* ... */ }; class Lion : virtual public Animal { /* ... */ };
int main( ) {  Liger lg;  /*既然我们已经在Tiger和Lion类的定义中声明了"virtual"关键字,于是下面的代码编译OK */  int weight = lg.getWeight(); }

请问构造函数中的能不能调用虚方法

不要在构造函数中调用虚方法。

派生类对象构造期间进入基类的构造函数时,对象类型变成了基类类型,而不是派生类类型。同样地,进入基类析构函数,对象也是基类类型。

所以,虚函数始终仅仅调用基类的虚函数(如果是基类调用虚函数),不能达到多态的效果。

请问拷贝构造函数的参数是什么传递方式,为什么

引用传递

原因:如果拷贝构造函数中的参数不是一个引用,即形如CClass(const CClass c_class),那么就相当于采用了传值的方式,而传值的方式会调用该类的拷贝构造函数,从而造成无穷递归地调用拷贝构造函数。所以拷贝构造函数的参数必须是一个引用。

类方法和数据的权限有哪几种


如何理解抽象类?

抽象类定义

虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”,有虚函数的类就叫做抽象类。

抽象类特点

  • 抽象类只能用作其他类的基类不能建立抽象类对象
  • 抽象类能用作参数类型函数返回类型显式转换的类型。
  • 定义指向抽象类的指针和引用,此指针可以指向它的派生类,进而实现多态性。

什么是多态?除了虚函数,还有什么方式能实现多态?

  • 多态是面向对象的重要特性之一,它是一种行为的封装,就是不同对象对同一行为会有不同的状态。(举例 : 学生和成人都去买票时,学生会打折,成人不会)
  • 多态是以封装和继承为基础的。在C++中多态分为静态多态(早绑定)动态多态(晚绑定)两种,其中动态多态是通过虚函数实现静态多态通过函数重载实现。

最近发表
标签列表