📜  常见的OOP面试问题|套装1(1)

📅  最后修改于: 2023-12-03 15:25:31.338000             🧑  作者: Mango

常见的OOP面试问题 | 套装1

在面试中经常会涉及面向对象编程(OOP)的问题,下面整理了一些常见的OOP面试问题。

1. OOP的基本原则是什么?

OOP的基本原则有四个,分别是:

  • 封装(Encapsulation):将数据和行为组合在一个类中,对外界隐藏实现细节,只提供公共接口进行访问。
  • 继承(Inheritance):子类可以继承父类的属性和方法,扩展或修改父类的功能。
  • 多态(Polymorphism):子类可以重写父类的方法,实现不同的行为,同时可以用一个基类类型的变量来引用不同子类对象的实例。
  • 抽象(Abstraction):抽象类和抽象方法可以提供规范和约束,让子类实现具体的功能。
2. 什么是类和对象?

类是一种抽象数据类型,它定义了一组共同拥有的属性和方法,用于描述某一类事物的特点和行为。对象是类的一个实例,具有该类所定义的属性和方法。

在OOP中,类是创建对象的模板,对象是类的具体实现。利用类和对象,可以封装数据和方法,提高代码的可重用性和安全性。

3. 构造函数和析构函数有什么作用?

构造函数用于初始化类的成员变量,在创建对象时自动调用。如果没有定义构造函数,编译器会自动生成默认构造函数。

析构函数用于释放对象占用的资源,在对象被销毁时自动调用。如果类中有指向动态分配内存的成员变量,需要在析构函数中进行内存释放操作,避免内存泄漏问题。

以下是构造函数和析构函数的示例代码:

class Person {
public:
    Person(string name, int age);
    ~Person();
private:
    string m_name;
    int m_age;
};

Person::Person(string name, int age) {
    m_name = name;
    m_age = age;
}

Person::~Person() {
    // 释放对象占用的资源
}
4. 什么是虚函数?

虚函数是用于实现多态的关键,在父类中声明为虚函数的成员函数,在子类中重写后可以实现不同的行为。通过虚函数,可以用父类类型的指针或引用来调用不同子类对象的实例。

以下是虚函数的示例代码:

class Animal {
public:
    virtual void eat();
};

class Cat : public Animal {
public:
    void eat();
};

class Dog : public Animal {
public:
    void eat();
};

void Animal::eat() {
    cout << "Animal is eating." << endl;
}

void Cat::eat() {
    cout << "Cat is eating fish." << endl;
}

void Dog::eat() {
    cout << "Dog is eating meat." << endl;
}

int main() {
    Animal* animal1 = new Cat();
    Animal* animal2 = new Dog();
    animal1->eat(); // output: Cat is eating fish.
    animal2->eat(); // output: Dog is eating meat.
    delete animal1;
    delete animal2;
}
5. 什么是多态?

多态是一种面向对象编程的特性,指同一类型的对象在不同情况下会呈现出不同的形态和行为。通过多态,可以实现代码的解耦合和可扩展性。

在OOP中,多态有两种实现方式:重载函数和虚函数。重载函数是指同一类中有相同名称但参数类型或个数不同的两个或多个函数,编译器会根据参数匹配来选择调用哪一个函数;虚函数是指在父类中声明为虚函数的成员函数,在子类中重写后可以实现不同的行为。

以下是多态的示例代码:

class Shape {
public:
    virtual double area() = 0;
    virtual double perimeter() = 0;
};

class Rectangle : public Shape {
public:
    Rectangle(double width, double length);
    double area();
    double perimeter();
private:
    double m_width;
    double m_length;
};

class Circle : public Shape {
public:
    Circle(double radius);
    double area();
    double perimeter();
private:
    double m_radius;
};

Rectangle::Rectangle(double width, double length) {
    m_width = width;
    m_length = length;
}

double Rectangle::area() {
    return m_width * m_length;
}

double Rectangle::perimeter() {
    return 2 * (m_width + m_length);
}

Circle::Circle(double radius) {
    m_radius = radius;
}

double Circle::area() {
    return 3.14 * m_radius * m_radius;
}

double Circle::perimeter() {
    return 2 * 3.14 * m_radius;
}

int main() {
    Shape* shape1 = new Rectangle(10, 5);
    Shape* shape2 = new Circle(3);
    cout << "Rectangle area: " << shape1->area() << endl; // output: 50
    cout << "Rectangle perimeter: " << shape1->perimeter() << endl; // output: 30
    cout << "Circle area: " << shape2->area() << endl; // output: 28.26
    cout << "Circle perimeter: " << shape2->perimeter() << endl; // output: 18.84
    delete shape1;
    delete shape2;
}

以上是常见的OOP面试问题套装1,欢迎大家批评指正。