MST

星途 面试题库

面试题:C++ 抽象类继承中的访问控制与多态

假设有一个抽象类 `Base` 包含纯虚函数 `virtual void func() = 0;`,从 `Base` 派生出 `Derived` 类并实现 `func` 函数。请解释在不同的继承方式(公有继承、私有继承、保护继承)下,`Derived` 类对象对 `Base` 类成员的访问权限变化,以及如何利用这些继承方式实现不同的多态效果。
19.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

公有继承

  • 访问权限变化:在公有继承中,Base 类的公有成员在 Derived 类中仍然是公有成员,Base 类的保护成员在 Derived 类中仍然是保护成员,Base 类的私有成员在 Derived 类中不可访问。
  • 多态效果实现:由于 Base 类的虚函数 func 在公有继承下其访问权限不变,仍然是公有,所以可以通过 Base 类指针或引用指向 Derived 类对象,从而实现多态。例如:
Base* ptr = new Derived();
ptr->func(); // 调用 Derived 类的 func 函数,实现多态

私有继承

  • 访问权限变化:在私有继承中,Base 类的公有成员和保护成员在 Derived 类中都变为私有成员,Base 类的私有成员在 Derived 类中仍然不可访问。
  • 多态效果实现:虽然 Derived 类对象可以调用 func 函数,但由于 Base 类成员在 Derived 类中变为私有,无法通过 Base 类指针或引用指向 Derived 类对象来实现多态。不过,可以在 Derived 类内部定义一个公有函数,在该函数内部调用 func 函数,间接实现多态效果。例如:
class Derived : private Base {
public:
    void callFunc() {
        func();
    }
};
Derived d;
d.callFunc(); // 间接调用 Derived 类的 func 函数

保护继承

  • 访问权限变化:在保护继承中,Base 类的公有成员和保护成员在 Derived 类中都变为保护成员,Base 类的私有成员在 Derived 类中仍然不可访问。
  • 多态效果实现:同私有继承类似,不能直接通过 Base 类指针或引用指向 Derived 类对象来实现多态。但如果从 Derived 类再派生出新的类,在新派生类中可以通过 Base 类指针或引用指向新派生类对象实现多态。例如:
class NewDerived : public Derived {
public:
    void newCallFunc() {
        Base* ptr = this;
        ptr->func(); // 调用 Derived 类的 func 函数,实现多态
    }
};
NewDerived nd;
nd.newCallFunc();