面试题答案
一键面试错误产生原因
当多个派生类通过不同路径继承自同一个虚基类时,如果虚基类中的成员在多个派生类中被重复定义,就会出现重复定义的编译错误。这是因为在多重继承体系中,可能会存在多条路径到达虚基类,编译器无法确定使用哪一个定义。例如,假设存在类A作为虚基类,类B和类C都从类A虚继承,然后类D从类B和类C继承。如果类B和类C分别对类A中的某个成员进行了定义,那么在类D中就会出现对该成员的重复定义。
解决方法
- 在虚基类中定义成员:将可能出现重复定义的成员直接在虚基类中进行定义。这样,无论通过多少条路径继承虚基类,都只会有一份定义。例如:
class A {
public:
void commonFunction() {
// 函数实现
}
};
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {};
- 使用内联函数:在派生类中对虚基类成员使用内联函数定义。内联函数在编译时会将函数体直接嵌入到调用处,避免了重复定义的问题。例如:
class A {};
class B : virtual public A {
public:
inline void commonFunction() {
// 函数实现
}
};
class C : virtual public A {
public:
inline void commonFunction() {
// 函数实现
}
};
class D : public B, public C {};
- 在一个派生类中定义,其他派生类声明为虚函数:在其中一个派生类中定义虚基类成员,其他派生类将该成员声明为虚函数且不定义。例如:
class A {};
class B : virtual public A {
public:
void commonFunction();
};
class C : virtual public A {
public:
virtual void commonFunction() = 0;
};
class D : public B, public C {};
void B::commonFunction() {
// 函数实现
}