MST

星途 面试题库

面试题:C++中向虚基类构造函数传递参数的常规途径有哪些

请简述在C++中,向虚基类构造函数传递参数通常可以通过哪些途径来实现,并给出简单的代码示例说明。
28.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

在C++中,向虚基类构造函数传递参数通常通过以下途径实现:

  1. 在最终派生类的构造函数初始化列表中直接传递:在最终派生类构造函数的初始化列表中,直接调用虚基类的构造函数并传递参数。这种方式确保虚基类只被初始化一次。

示例代码如下:

#include <iostream>

// 虚基类
class VirtualBase {
public:
    int value;
    VirtualBase(int v) : value(v) {
        std::cout << "VirtualBase constructor with value: " << value << std::endl;
    }
};

// 中间派生类1
class Derived1 : virtual public VirtualBase {
public:
    Derived1(int v) : VirtualBase(v) {
        std::cout << "Derived1 constructor" << std::endl;
    }
};

// 中间派生类2
class Derived2 : virtual public VirtualBase {
public:
    Derived2(int v) : VirtualBase(v) {
        std::cout << "Derived2 constructor" << std::endl;
    }
};

// 最终派生类
class FinalDerived : public Derived1, public Derived2 {
public:
    FinalDerived(int v) : VirtualBase(v), Derived1(v), Derived2(v) {
        std::cout << "FinalDerived constructor" << std::endl;
    }
};

int main() {
    FinalDerived fd(10);
    return 0;
}

在上述代码中,FinalDerived类通过其构造函数的初始化列表直接调用VirtualBase的构造函数传递参数10,同时Derived1Derived2也从VirtualBase虚继承,这样VirtualBase只会被初始化一次。

  1. 通过中间派生类传递:中间派生类在其构造函数初始化列表中调用虚基类构造函数并传递参数,最终派生类通过调用中间派生类构造函数间接传递参数给虚基类。

示例代码如下:

#include <iostream>

// 虚基类
class VirtualBase {
public:
    int value;
    VirtualBase(int v) : value(v) {
        std::cout << "VirtualBase constructor with value: " << value << std::endl;
    }
};

// 中间派生类1
class Derived1 : virtual public VirtualBase {
public:
    Derived1(int v) : VirtualBase(v) {
        std::cout << "Derived1 constructor" << std::endl;
    }
};

// 中间派生类2
class Derived2 : virtual public VirtualBase {
public:
    Derived2(int v) : VirtualBase(v) {
        std::cout << "Derived2 constructor" << std::endl;
    }
};

// 最终派生类
class FinalDerived : public Derived1, public Derived2 {
public:
    FinalDerived(int v) : Derived1(v), Derived2(v) {
        std::cout << "FinalDerived constructor" << std::endl;
    }
};

int main() {
    FinalDerived fd(20);
    return 0;
}

在此代码中,FinalDerived类通过调用Derived1Derived2的构造函数,间接将参数传递给VirtualBase的构造函数。虽然这种方式可行,但直接在最终派生类初始化列表中调用虚基类构造函数更为清晰和直接,也更能确保虚基类只被初始化一次的特性。