MST

星途 面试题库

面试题:C++访问控制与多态的结合应用

在C++中,定义一个基类Shape,包含虚函数draw(),该函数在基类中为保护成员。然后定义两个派生类Circle和Rectangle,均以public方式继承Shape类并重写draw()函数,将其访问权限改为公有。请设计一个函数void display(Shape* s),在该函数中根据传入对象的实际类型调用相应的draw()函数。请说明这样做的合理性以及可能存在的风险,并给出代码实现。
15.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

代码实现

#include <iostream>

class Shape {
protected:
    virtual void draw() const {
        std::cout << "This is a Shape." << std::endl;
    }
};

class Circle : public Shape {
public:
    void draw() const override {
        std::cout << "This is a Circle." << std::endl;
    }
};

class Rectangle : public Shape {
public:
    void draw() const override {
        std::cout << "This is a Rectangle." << std::endl;
    }
};

void display(Shape* s) {
    if (s) {
        s->draw();
    }
}

合理性

  1. 多态性体现:通过将draw函数定义为虚函数,使得display函数能够根据传入对象的实际类型(CircleRectangle)来调用相应的draw函数,实现了运行时的多态性,提高了代码的灵活性和可扩展性。当有新的派生类(如Triangle)继承Shape类时,只需要在新类中重写draw函数,display函数无需修改即可支持新类型。
  2. 代码复用display函数的实现不依赖于具体的派生类类型,只依赖于基类指针,使得代码可以复用。

可能存在的风险

  1. 空指针风险:在display函数中,如果传入的指针s为空,调用draw函数会导致程序崩溃。虽然在display函数中进行了简单的空指针检查,但在调用display函数之前仍有可能出现未检查空指针的情况。
  2. 访问权限变化:基类中draw函数是保护成员,派生类将其访问权限改为公有,这可能会破坏基类封装的原则。在某些情况下,这种访问权限的变化可能会导致不符合预期的行为,因为原本在基类设计中,draw函数是不想被外部直接调用的,而派生类的改变使得外部可以调用。