面试题答案
一键面试类设计
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;
}
};
设计原则解释
- 数据安全性和封装性:将
name
成员变量设为protected
,使得它不能从类外部直接访问,保证了数据的安全性。同时,派生类Dog
和Cat
可以访问name
,满足合理访问的需求。 - 合理访问和重写:
speak
函数设为public
且virtual
,这使得Dog
和Cat
类可以重写该函数,实现各自特定的行为。public
访问属性保证了从类外部可以调用该函数,而virtual
关键字使得在运行时能够根据对象的实际类型调用正确的speak
函数版本。
访问属性在继承过程中的变化
public
继承:public
成员在派生类中仍然是public
。protected
成员在派生类中仍然是protected
。private
成员在派生类中不可访问。
protected
继承:public
成员在派生类中变为protected
。protected
成员在派生类中仍然是protected
。private
成员在派生类中不可访问。
private
继承:public
成员在派生类中变为private
。protected
成员在派生类中变为private
。private
成员在派生类中不可访问。
在本设计中,采用public
继承,保持了基类Animal
的public
和protected
成员在派生类Dog
和Cat
中的访问属性,使得派生类可以合理访问和重写相关成员,同时保证了数据的安全性和封装性。