将参数传递给基类构造函数C++

Passing Parameters to Base Class Constructors C++

本文关键字:构造函数 C++ 基类 参数传递      更新时间:2023-10-16

我喜欢在C++中保持类声明和定义的独立性。因此,在标题中,我可以定义一个"基本"类如下:

# Base.h
class Base 
{
    int n;    
public:
    Base(int x);
};

并在cpp文件中定义其构造函数实现,即

# Base.c
Base::Base(int x) 
{
    n = x;
}

现在,如果我定义了一个继承"基类"的"派生"类,我可以将参数传递给基类,如下所示:

#Derived.h
class Derived : public Base
{
    int t;
public:
    Derived(int y) : Base(t) {t = y;}
}

但是,这样做需要将派生类的构造函数的主体放在头文件中,即{t = y;},因此构造函数定义不再与其声明分离。有没有一种方法可以将参数传递给类的基类构造函数,使我能够在cpp文件中定义派生类的构造函数?

是的,在头文件中:

class Derived : public Base
{
    int t;
public:
    Derived(int y); // Declaration of constructor
};

在cpp文件中时:

Derived::Derived(int y) : Base(t) { // Definition of constructor
    t = y;
}

类构造函数的定义中以及类定义中的内联中都允许成员初始值设定项列表。如果您感兴趣,我还建议您查看cppreference,了解关于初始化顺序和成员将在执行复合构造函数主体之前初始化这一事实的两个小注意事项。

有没有一种方法可以将参数传递给类的基类构造函数,使我能够在cpp文件中定义派生类的构造函数?

当然有。头可以只声明构造函数,就像你对Base:所做的那样

class Derived : public Base
{
    int t;
public:
    Derived(int y);
};

然后您可以在源文件中实现它,就像您对Base:所做的那样

Derived::Derived(int y) : Base(y), t(y) {}

请注意,您必须将参数y,而不是(尚未初始化的)成员t传递给基构造函数。基本子对象总是在成员之前初始化。