面试题答案
一键面试在C++多继承场景下,Derived
类的printData
函数要正确访问不同基类和自身的成员数据,可按如下方式实现:
#include <iostream>
class Base1 {
public:
int base1Data;
void printData() {
std::cout << "Base1 data: " << base1Data << std::endl;
}
};
class Base2 {
public:
int base2Data;
void printData() {
std::cout << "Base2 data: " << base2Data << std::endl;
}
};
class Derived : public Base1, public Base2 {
public:
int derivedData;
void printData() {
// 访问Base1的成员数据
std::cout << "Base1 data from Derived: " << base1Data << std::endl;
// 访问Base2的成员数据
std::cout << "Base2 data from Derived: " << base2Data << std::endl;
// 访问自身的成员数据
std::cout << "Derived data: " << derivedData << std::endl;
}
};
原理和涉及机制
-
作用域解析:在
Derived
类的printData
函数中,直接使用成员变量名base1Data
、base2Data
和derivedData
时,编译器会按照作用域规则查找。首先在Derived
类的作用域内查找,若未找到则在其基类(Base1
和Base2
)的作用域内查找。由于这些成员变量在各自类中定义且没有命名冲突,所以可以直接访问。 -
继承机制:
Derived
类从Base1
和Base2
继承,会包含Base1
和Base2
的成员变量和成员函数。当Derived
类对象创建时,其内存布局包含Base1
子对象、Base2
子对象以及Derived
类自身定义的成员。所以在printData
函数中能够直接访问这些成员。 -
虚函数和函数重写(本题未涉及但需注意):如果
Base1
和Base2
的printData
函数是虚函数,且Derived
类重写了该函数,那么通过基类指针或引用调用printData
时,会根据对象的实际类型(即运行时类型)来决定调用哪个版本的printData
。在本题中,因为没有虚函数相关操作,所以Derived
类的printData
函数直接访问自身和基类的成员数据。