【发布时间】:2013-11-30 06:42:24
【问题描述】:
1) 我想创建一个抽象类,它的两个派生类可以继承所有抽象方法,而不必重写任何行为。这意味着我没有纯虚函数来强制子类提供。这是否意味着我不能创建抽象类(我知道在 Java 中我可以)?
2) 我有点不确定我是如何创建派生类的,考虑到我有一个抽象类的构造函数——但是这个构造函数的目的是什么?我应该从任何地方显式调用它吗?
【问题讨论】:
标签: c++ inheritance abstract-class overriding
1) 我想创建一个抽象类,它的两个派生类可以继承所有抽象方法,而不必重写任何行为。这意味着我没有纯虚函数来强制子类提供。这是否意味着我不能创建抽象类(我知道在 Java 中我可以)?
2) 我有点不确定我是如何创建派生类的,考虑到我有一个抽象类的构造函数——但是这个构造函数的目的是什么?我应该从任何地方显式调用它吗?
【问题讨论】:
标签: c++ inheritance abstract-class overriding
是的,您仍然可以将其抽象化。惯用的做法是使析构函数成为纯虚拟的。 (注意,尽管是纯虚拟的,你仍然需要为析构函数提供定义。)
例如
struct Base {
virtual ~Base() = 0;
virtual void fn1();
virtual void fn2();
// ...
};
如果要从派生类构造函数中调用非默认构造函数,则需要使用成员初始化列表。例如
Derived::Derived() : Base(0, 1.5, "hello") {
}
如果你只是调用基类的默认构造函数,你通常可以省略它,当构造任何派生类的实例时,默认的基构造函数将被自动调用。
【讨论】:
1) 在 C++ 中,您不必将类定义为抽象类或任何东西。您可以扩展您想要的任何类,如果您不想覆盖函数行为,您甚至不必将方法标记为虚拟。如果它们是 protected 或 public,它们将可以在派生类中访问。
2) 将在派生类的构造函数之前调用基类的构造函数,而无需您的命令。
【讨论】:
1) 将你的析构函数声明为纯虚函数:
virtual ~BaseClass() = 0;
2) 您可以从派生类的构造函数初始化列表中调用它,但如果它是默认构造函数,它将被自动调用。请记住 - 要初始化派生对象,您必须首先初始化其基类部分(在默认构造函数的情况下,通过调用基类的构造函数自动为您完成)。
【讨论】: