MST

星途 面试题库

面试题:C++类成员访问属性设计原则在继承体系中的应用

假设有一个基类Animal,包含成员变量name和成员函数speak。现有两个派生类Dog和Cat继承自Animal。请根据C++类成员访问属性的设计原则,设计这几个类的成员访问属性,使得在Dog和Cat类中可以合理地访问和重写相关成员,同时保证数据的安全性和封装性。并解释为什么这样设计符合设计原则,以及不同访问属性在继承过程中的变化。
37.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

类设计

class Animal {
protected:
    std::string name;
public:
    Animal(const std::string& n) : name(n) {}
    virtual void speak() const {
        std::cout << "I am an animal." << std::endl;
    }
};

class Dog : public Animal {
public:
    Dog(const std::string& n) : Animal(n) {}
    void speak() const override {
        std::cout << "I am a dog, my name is " << name << std::endl;
    }
};

class Cat : public Animal {
public:
    Cat(const std::string& n) : Animal(n) {}
    void speak() const override {
        std::cout << "I am a cat, my name is " << name << std::endl;
    }
};

设计原则解释

  1. 数据安全性和封装性:将name成员变量设为protected,使得它不能从类外部直接访问,保证了数据的安全性。同时,派生类DogCat可以访问name,满足合理访问的需求。
  2. 合理访问和重写speak函数设为publicvirtual,这使得DogCat类可以重写该函数,实现各自特定的行为。public访问属性保证了从类外部可以调用该函数,而virtual关键字使得在运行时能够根据对象的实际类型调用正确的speak函数版本。

访问属性在继承过程中的变化

  1. public继承
    • public成员在派生类中仍然是public
    • protected成员在派生类中仍然是protected
    • private成员在派生类中不可访问。
  2. protected继承
    • public成员在派生类中变为protected
    • protected成员在派生类中仍然是protected
    • private成员在派生类中不可访问。
  3. private继承
    • public成员在派生类中变为private
    • protected成员在派生类中变为private
    • private成员在派生类中不可访问。

在本设计中,采用public继承,保持了基类Animalpublicprotected成员在派生类DogCat中的访问属性,使得派生类可以合理访问和重写相关成员,同时保证了数据的安全性和封装性。