• Index

简述继承中的构造函数

Reads: 1

我们知道,构造函数不会被继承到派生类。在上面的示例代码中,由于类u32stringex没有写明构造函数,那么,编译器就会给它添加一个默认的构造函数。跟普通的类不一样的是,普通的类的默认构造函数,除了给成员变量分配内存以外,什么都不干;而派生类的构造函数,除了给成员变量分配内存以外,还会调用基类的无参数构造函数,这样才能确保基类的成员变量能够正确地初始化。

如果基类没有无参数的构造函数,而且派生类不写构造函数时,那么编译器为派生类添加默认构造函数时,找不到基类的无参数的构造函数,接下来就会报错。

由于派生类必须要调用基类的构造函数,因此这个时候就要明确写出派生类的构造函数并且调用基类的构造函数。

接下来就要说明如下调用基类构造函数。

基础示例

#include <iostream>
#include <string>

class u32stringex : public std::u32string
{
public:
    u32stringex(void);
    u32stringex(std::size_t n, char32_t c);
};

int main(void)
{
    u32stringex text1; // aaaaa
    u32stringex text2(10, 'b'); // bbbbbbbbbb
    std::cout << "字符串1的字符数:" << text1.size() << std::endl;
    std::cout << "字符串2的字符数:" << text2.size() << std::endl;

    return 0;
}

u32stringex::u32stringex(void)
    : std::u32string(5, 'a')
{
}

u32stringex::u32stringex(std::size_t n, char32_t c)
    : std::u32string(n, c)
{
}

输出结果:

字符串1的字符数:5
字符串2的字符数:10

基础讲解

调用基类的构造函数是写在初始化列表中的。u32stringex的无参数构造函数调用了基类的std::u32string(5, 'a'),那么u32stringex text1;中的text1的值就是"aaaaa";而u32stringex调用的也是基类的std::u32string(n, c),那么u32stringex text2(10, 'b');中的text2的值就是"bbbbbbbbbb"


Comments

Make a comment

  • Index

WARNING: You are using an old browser that does not support HTML5. Please choose a modern browser (Chrome / Microsoft Edge / Firefox / Sarafi) to get a good experience.