【问题标题】:Inheritance - C++继承 - C++
【发布时间】:2012-09-14 18:01:29
【问题描述】:

我正在使用一个类 baseClass,我从中派生出另一个类 derivedClass。除了其他问题,我有一个问题定义:

i) 应该使用成员 - 对象初始化器来初始化在基类中声明的数据成员,例如 var1。

ii) i) 在基类构造函数中完成。它说,这只能通过派生类构造函数调用。

iii) 基类是一个抽象类,它的对象不能被创建。但是,我有第三节课,我在里面使用:

baseClass *baseObjects[5];

编译器不报错。

不明白 i) 和 ii) 的真正含义。用简单的话来解释就好了。此外,欢迎对 iii) 提供任何帮助。

【问题讨论】:

  • 也许您需要一本 C++ 书籍或一门课程?因为super 不是 C++ 关键字,那是 Java 的东西。
  • 错误。我的意思是与 super() 相关的东西。即使用派生构造函数,它也将适当的值传递给基类构造函数。

标签: c++ inheritance


【解决方案1】:

问题 1: 阅读构造函数:http://www.cprogramming.com/tutorial/constructor_destructor_ordering.html

问题 2: 阅读初始化列表:
http://www.cprogramming.com/tutorial/initialization-lists-c++.html

问题 3: 了解指向派生类的指针:
http://www.learncpp.com/cpp-tutorial/121-pointers-and-references-to-the-base-class-of-derived-objects/

我认为这样你就可以理解发生了什么,而不是仅仅回答你的问题,

【讨论】:

    【解决方案2】:

    我认为最好有插图。

    我)

    class A
    {
      int i;
     public:
      A(int ii) : i(ii) {}
    }
    

    i(ii) 部分是成员 - 对象初始化程序的示例。由于 C++ 保证在进入构造函数主体之前调用所有成员的构造函数,因此这是指定为每个成员调用哪个构造函数的唯一方法。

    ii) 在 C++ 中没有 super 关键字。您必须这样指定基类:

     class B : public A
     {
     public:
       B(int i) : A(i) {}
     }
    

    这部分是因为 C++ 允许多重继承。

    iii) 请注意,您没有创建任何对象,只创建了指向对象的指针。正是通过这种方法,在C++中通过继承实现了多态性。

    【讨论】:

      【解决方案3】:
      #include <iostream>
      
      class Base
      {
      public:
          Base(int i)
          {}
      
          virtual ~Base() = 0
          {}
      
      protected:
          int i_;
      };
      
      class Derived: public Base
      {
      public:
          Derived(int i, int j) : Base(i), j_(j)
          {}
      
      private:
          int j_;
      };
      
      int main(int argc, char* argv[])
      {
          //Base b(1); object of abstract class is not allowed
          Derived d(1, 2); // this is fine
      }
      

      正如您所见,i_ 正在由 Derived 类通过调用 Base 类构造函数来初始化。析构函数上的 = 0 确保 Base 类是纯虚拟的,因此我们无法实例化它(参见 main 中的注释)。

      【讨论】:

        【解决方案4】:

        i) 以下是所谓的初始化列表,您可以使用初始化列表来确保数据成员在进入构造函数之前具有值。所以在下面的例子中,a 在你进入构造函数之前的值为 10。

        Class baseClass
        {
            int a;
        public:
            baseClass(int x):a(x)
            {
            }
        }
        

        ii) 这就是您从派生类构造函数显式调用基类构造函数的方式。

        Class derivedClass : public baseClass
        {
            int a;
        public:
            derivedClass(int x):baseClass(x)
            {
            }
        }
        

        iii) 您不能直接创建抽象类的实例。但是,您可以创建指向抽象基类的指针,并让这些指针指向它的任何具体实现。因此,如果您有一个抽象基类Bird 和具体实现ParrotSparrow,那么Bird* bird 可以指向ParrotSparrow 实例,因为它们都是鸟。

        【讨论】:

          猜你喜欢
          • 2015-04-19
          • 2012-10-30
          • 2023-04-06
          • 2010-11-05
          • 2016-03-02
          • 2017-03-31
          • 2012-02-13
          • 2015-12-09
          • 1970-01-01
          相关资源
          最近更新 更多