面试题答案
一键面试在C++中,向虚基类构造函数传递参数通常通过以下途径实现:
- 在最终派生类的构造函数初始化列表中直接传递:在最终派生类构造函数的初始化列表中,直接调用虚基类的构造函数并传递参数。这种方式确保虚基类只被初始化一次。
示例代码如下:
#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
,同时Derived1
和Derived2
也从VirtualBase
虚继承,这样VirtualBase
只会被初始化一次。
- 通过中间派生类传递:中间派生类在其构造函数初始化列表中调用虚基类构造函数并传递参数,最终派生类通过调用中间派生类构造函数间接传递参数给虚基类。
示例代码如下:
#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
类通过调用Derived1
和Derived2
的构造函数,间接将参数传递给VirtualBase
的构造函数。虽然这种方式可行,但直接在最终派生类初始化列表中调用虚基类构造函数更为清晰和直接,也更能确保虚基类只被初始化一次的特性。