【问题标题】:Regarding Inheritance and Polymorphism in C++关于 C++ 中的继承和多态性
【发布时间】:2015-01-02 12:01:18
【问题描述】:

我有几个关于 C++ 的一般性问题,我想知道是否有人可以回答。 我正在编写一个 .cpp 文件,其中包含我的老师提供给我们的头文件的实现。我们不允许修改文件。基本上,标题有一个基类船的声明,和 4 种特定类型的船。我的问题是: 1) 基类 ship 的类定义没有提供构造函数。相反,它有一个受保护的 Set 函数,用于设置私有数据成员的值。编译器是否提供默认构造函数? (基本上它会自动将私有 int 变量设置为 1)?因为我使用的是动态内存函数 new 来创建 Ship 派生类的对象。

2) 我有函数头 virtual int size(void) const = 0;在基级船内。我想在另一个成员函数中使用 size() 函数来检查船的大小是否有效。我会在成员函数声明中使用 this->size() 来做到这一点吗? (我已经在每个特定派生类的实现中覆盖了虚函数大小)

非常感谢!如果我需要包含代码或更具体,请告诉我。感谢您的帮助。

【问题讨论】:

  • 1) Does the compiler provide a default constructor? 这取决于,但即使这样做,成员 ints 也会被默认初始化,即垃圾。 2) 好吧,是的,否则你会怎么做?
  • 我的问题是,编译器会自动知道选择哪个 size() 函数吗?因为我为每个派生类重写了 size 函数。
  • 你的编译器不会(通常不会),虚拟调度是一个运行时特性。如果函数是虚拟的,则“正确”函数将在运行时调用,假设您的代码中没有错误。

标签: c++ inheritance polymorphism protected


【解决方案1】:

1) 编译器是否提供默认构造函数?

通常,是的。

(基本上是自动设置private int变量等于1)?

没有。默认构造函数不会将 int 成员(私有或其他)设置为任何内容。它们是未初始化的,直到它们被首次分配后才能被读取。

因为我使用动态内存函数new来创建Ship的派生类的对象。

这与私有 int 的初始化位置无关(即它仍然没有)。

2)我在基类ship 中有函数头virtual int size(void) const = 0;。我想在另一个成员函数中使用size() 函数来检查船的大小是否有效。我会在成员函数声明中使用this->size() 来执行此操作吗? (我已经在每个特定派生类的实现中覆盖了虚函数大小)

作为初学者,一个合理的经验法则是尽可能简单地调用函数:size()。只有当这不起作用时,您才会尝试this->size()。它可能不起作用的原因变得复杂,但指南非常简单。

【讨论】:

  • size() 函数为不同的类返回不同的值。你知道我如何为正确的派生类调用 size() 吗?我只是简单地写 size() 并且编译器会选择吗?
  • @KevinCheng 你说过它是virtual - 这意味着如果你有一个Base&Base* 到类型层次结构中的任何对象,你可以调用size(),它会调用实际动态类型的实现。尝试一下,如果遇到问题,请发布您的代码,并说明您的预期、观察到的内容以及您不了解这一切的原因......
  • 我明白了。谢谢!!!它与 this->size() 一起工作。问题:我需要包含 this() 指针吗? this 指针也是指向基类的指针吗?
  • @KevinCheng 在实践中,很少需要在代码中的任何位置明确提及this 指针。尽量不要使用它,除非你遇到编译器错误并且发现/读到this-> 是在代码中的特定位置表达你想要做的事情的正确方法。在任何函数 Class::f() 中,this 指针的 static 类型是 Class*(即 不是 Base*,除非 fBase 中),而 dynamic 类型是实际正在处理的大多数派生对象。 IE。 virtual 函数 this 的内部实现与提供实现的类类型有关。
猜你喜欢
  • 2015-10-26
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多