📜  C++ |构造函数|问题15(1)

📅  最后修改于: 2023-12-03 15:13:58.132000             🧑  作者: Mango

C++ | 构造函数 | 问题15

C++中的构造函数是一种特殊的成员函数,其主要作用是在对象被创建时初始化对象的数据成员。问题15涉及到在派生类中调用基类构造函数,本文将为大家介绍C++中基类构造函数的调用方式。

基类构造函数调用

在C++中,派生类的构造函数中必须调用其直接基类的构造函数,以确保从基类继承下来的数据成员被正确初始化。例如,我们定义了一个基类Animal和其派生类Dog,我们需要在Dog的构造函数中调用Animal的构造函数来初始化从基类继承下来的数据成员。

class Animal {
public:
    Animal(int age) : m_age(age) {}
protected:
    int m_age;
};

class Dog : public Animal {
public:
    Dog(int age, const std::string& name) : Animal(age), m_name(name) {}
private:
    std::string m_name;
};

在上面的代码中,我们定义了一个基类Animal和其派生类DogAnimal有一个整型数据成员m_ageDog有一个字符串数据成员m_name。在Dog的构造函数中,我们在初始化列表中显式调用了Animal的构造函数来初始化m_age,然后再初始化m_name

基类构造函数的调用方式

在上面的例子中,我们使用了以下方式调用基类构造函数:

Dog(int age, const std::string& name) : Animal(age), m_name(name) {}

其中,Animal(age)是对基类构造函数的调用。在派生类的构造函数中,我们可以通过以下两种方式调用基类构造函数:

  • 在初始化列表中显式调用基类构造函数。
  • 在派生类构造函数的函数体中使用BaseClass::BaseClass()语法来调用基类构造函数。
class Dog : public Animal {
public:
    Dog(int age, const std::string& name) : Animal(age), m_name(name) {}     // 调用方式1
    Dog(int age, const std::string& name) {
        Animal::Animal(age);                                                  // 调用方式2
        m_name = name;
    }
private:
    std::string m_name;
};

在上述两种调用方式中,第一种更为常用。

确定基类构造函数调用方式的原则

在使用基类构造函数时,以下原则需注意:

  • 在派生类的构造函数中必须调用直接基类的构造函数。
  • 如果在派生类的构造函数中未显式调用基类构造函数,则会自动调用默认构造函数。
  • 若基类没有提供默认构造函数,则必须显式调用基类其他构造函数。
结论

在派生类的构造函数中,我们必须通过显式调用基类的构造函数来初始化从基类继承下来的数据成员。在使用基类构造函数时,我们应遵循确定基类构造函数调用方式的原则。