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

4

我喜欢在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;}
}

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

10

是的,有,在头文件中:

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,了解有关初始化顺序的两个小注意事项以及成员将在复合构造函数体执行之前进行初始化的事实。


4
有没有一种方法可以将参数传递到类的基类构造函数中,同时仍然能够在cpp文件中定义派生类的构造函数?
当然有。头文件可以像您为Base所做的那样声明构造函数:
class Derived : public Base
{
    int t;
public:
    Derived(int y);
};

然后,您可以在源文件中实现该功能,方式与您为Base所做的完全相同:

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

请注意,您需要将参数y传递给基类构造函数,而不是尚未初始化的成员变量t。基类子对象始终在成员变量之前初始化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接