1)我想创建一个抽象类,两个派生类可以继承所有抽象方法,而不必覆盖任何行为。这意味着我没有强制虚函数来强制子类提供。这是否意味着我无法创建一个抽象类(我知道我可以使用Java)?
2)我有点不确定如何创建派生类,考虑到我有一个抽象类的构造函数 - 但这个构造函数的目的是什么?我应该从任何地方明确地调用它吗?
答案 0 :(得分:2)
是的,您仍然可以将其抽象化。惯用的事情是使析构函数纯粹虚拟。 (注意,尽管是纯虚拟的,你仍然需要为析构函数提供一个定义。)
E.g。
struct Base {
virtual ~Base() = 0;
virtual void fn1();
virtual void fn2();
// ...
};
如果要从派生类构造函数中调用非默认构造函数,则需要使用成员初始化列表。 E.g。
Derived::Derived() : Base(0, 1.5, "hello") {
}
如果您只是调用基类的默认构造函数,通常可以将其保留,并在构造任何派生类的实例时自动调用默认的基础构造函数。
答案 1 :(得分:1)
1)在C ++中,您不必将类定义为抽象或任何东西。您可以扩展所需的任何类,如果您不想覆盖函数行为,则甚至不必将方法标记为虚拟。如果它们是protected
或public
,则可以在派生类中访问它们。
2)在派生类的构造函数之前,将在没有您的命令的情况下调用基类的构造函数。
答案 2 :(得分:1)
1)将析构函数声明为纯虚拟:
virtual ~BaseClass() = 0;
2)您可以从派生类的构造函数初始化列表中调用它,但如果它是默认构造函数,则会自动调用它。记住 - 要初始化派生对象,必须首先初始化它的基类部分(在默认构造函数的情况下,通过调用基类的构造函数自动完成)。