MST

星途 面试题库

面试题:C++ 成员函数区分不同对象成员数据在多继承场景下的原理

考虑一个C++ 多继承的场景,有类 `Base1` 和 `Base2`,类 `Derived` 继承自 `Base1` 和 `Base2`,三个类都有各自的成员变量 `int base1Data;`、`int base2Data;` 和 `int derivedData;`,以及成员函数 `void printData();`。在 `Derived` 类的 `printData` 函数中,如何确保正确访问不同基类和自身的成员数据,详细阐述其原理和涉及的机制。
35.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

在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;
    }
};

原理和涉及机制

  1. 作用域解析:在Derived类的printData函数中,直接使用成员变量名base1Database2DataderivedData时,编译器会按照作用域规则查找。首先在Derived类的作用域内查找,若未找到则在其基类(Base1Base2)的作用域内查找。由于这些成员变量在各自类中定义且没有命名冲突,所以可以直接访问。

  2. 继承机制Derived类从Base1Base2继承,会包含Base1Base2的成员变量和成员函数。当Derived类对象创建时,其内存布局包含Base1子对象、Base2子对象以及Derived类自身定义的成员。所以在printData函数中能够直接访问这些成员。

  3. 虚函数和函数重写(本题未涉及但需注意):如果Base1Base2printData函数是虚函数,且Derived类重写了该函数,那么通过基类指针或引用调用printData时,会根据对象的实际类型(即运行时类型)来决定调用哪个版本的printData。在本题中,因为没有虚函数相关操作,所以Derived类的printData函数直接访问自身和基类的成员数据。