面试题答案
一键面试抽象类构造函数的作用
- 初始化成员变量:和普通类构造函数一样,抽象类构造函数用于初始化抽象类中定义的成员变量。这确保了在创建派生类对象时,从抽象类继承的部分能够有合适的初始状态。
- 为派生类初始化做准备:它可以为派生类对象的初始化设置一些基础条件,例如初始化一些派生类可能会用到的公共资源或状态。
抽象类构造函数的调用时机
在创建派生类对象时,首先会调用抽象类的构造函数,然后再调用派生类自身的构造函数。即使抽象类不能被直接实例化,但作为基类,其构造函数会在派生类对象创建过程中被优先调用。
示例说明
#include <iostream>
class AbstractClass {
public:
int baseValue;
AbstractClass(int value) : baseValue(value) {
std::cout << "AbstractClass constructor called with value: " << baseValue << std::endl;
}
virtual void pureVirtualFunction() = 0;
};
class DerivedClass : public AbstractClass {
public:
int derivedValue;
DerivedClass(int base, int derived) : AbstractClass(base), derivedValue(derived) {
std::cout << "DerivedClass constructor called with base value: " << baseValue
<< " and derived value: " << derivedValue << std::endl;
}
void pureVirtualFunction() override {
std::cout << "Implementation of pure virtual function in DerivedClass. Base value: "
<< baseValue << ", Derived value: " << derivedValue << std::endl;
}
};
int main() {
DerivedClass obj(10, 20);
obj.pureVirtualFunction();
return 0;
}
在上述示例中,AbstractClass
是一个抽象类,它有一个构造函数用于初始化 baseValue
。DerivedClass
继承自 AbstractClass
,在 DerivedClass
的构造函数初始化列表中,先调用了 AbstractClass
的构造函数,传递 base
值,从而完成对从抽象类继承的 baseValue
的初始化。之后 DerivedClass
构造函数继续初始化自身的 derivedValue
。在 main
函数中创建 DerivedClass
对象时,我们可以看到先调用了抽象类构造函数,然后调用派生类构造函数,并且在 pureVirtualFunction
实现中可以使用从抽象类继承并初始化好的 baseValue
。