MST

星途 面试题库

面试题:C++中抽象类构造函数的作用及调用时机

在C++里,抽象类包含至少一个纯虚函数。请阐述抽象类构造函数的作用是什么?它在何时被调用?同时举例说明抽象类构造函数如何为派生类对象的初始化做准备。
49.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

抽象类构造函数的作用

  1. 初始化成员变量:和普通类构造函数一样,抽象类构造函数用于初始化抽象类中定义的成员变量。这确保了在创建派生类对象时,从抽象类继承的部分能够有合适的初始状态。
  2. 为派生类初始化做准备:它可以为派生类对象的初始化设置一些基础条件,例如初始化一些派生类可能会用到的公共资源或状态。

抽象类构造函数的调用时机

在创建派生类对象时,首先会调用抽象类的构造函数,然后再调用派生类自身的构造函数。即使抽象类不能被直接实例化,但作为基类,其构造函数会在派生类对象创建过程中被优先调用。

示例说明

#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 是一个抽象类,它有一个构造函数用于初始化 baseValueDerivedClass 继承自 AbstractClass,在 DerivedClass 的构造函数初始化列表中,先调用了 AbstractClass 的构造函数,传递 base 值,从而完成对从抽象类继承的 baseValue 的初始化。之后 DerivedClass 构造函数继续初始化自身的 derivedValue。在 main 函数中创建 DerivedClass 对象时,我们可以看到先调用了抽象类构造函数,然后调用派生类构造函数,并且在 pureVirtualFunction 实现中可以使用从抽象类继承并初始化好的 baseValue