【问题标题】:C++ Abstract classes and creating derived classesC++ 抽象类和创建派生类
【发布时间】:2013-11-30 06:42:24
【问题描述】:

1) 我想创建一个抽象类,它的两个派生类可以继承所有抽象方法,而不必重写任何行为。这意味着我没有纯虚函数来强制子类提供。这是否意味着我不能创建抽象类(我知道在 Java 中我可以)?

2) 我有点不确定我是如何创建派生类的,考虑到我有一个抽象类的构造函数——但是这个构造函数的目的是什么?我应该从任何地方显式调用它吗?

【问题讨论】:

    标签: c++ inheritance abstract-class overriding


    【解决方案1】:

    是的,您仍然可以将其抽象化。惯用的做法是使析构函数成为纯虚拟的。 (注意,尽管是纯虚拟的,你仍然需要为析构函数提供定义。)

    例如

    struct Base {
        virtual ~Base() = 0;
    
        virtual void fn1();
        virtual void fn2();
        // ...
    };
    

    如果要从派生类构造函数中调用非默认构造函数,则需要使用成员初始化列表。例如

    Derived::Derived() : Base(0, 1.5, "hello") {
    }
    

    如果你只是调用基类的默认构造函数,你通常可以省略它,当构造任何派生类的实例时,默认的基构造函数将被自动调用。

    【讨论】:

      【解决方案2】:

      1) 在 C++ 中,您不必将类定义为抽象类或任何东西。您可以扩展您想要的任何类,如果您不想覆盖函数行为,您甚至不必将方法标记为虚拟。如果它们是 protectedpublic,它们将可以在派生类中访问。

      2) 将在派生类的构造函数之前调用基类的构造函数,而无需您的命令。

      【讨论】:

        【解决方案3】:

        1) 将你的析构函数声明为纯虚函数:

        virtual ~BaseClass() = 0;
        

        2) 您可以从派生类的构造函数初始化列表中调用它,但如果它是默认构造函数,它将被自动调用。请记住 - 要初始化派生对象,您必须首先初始化其基类部分(在默认构造函数的情况下,通过调用基类的构造函数自动为您完成)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-01
          • 1970-01-01
          • 2013-08-30
          • 1970-01-01
          • 2019-04-27
          • 2012-04-22
          • 2020-09-01
          • 1970-01-01
          相关资源
          最近更新 更多