At Zoox, sensor fusion code manages a fleet of onboard sensors through a shared base class. Below is a simplified version of that hierarchy, along with the code that exercises it in main.
#include <iostream>
using namespace std;
class Sensor {
public:
Sensor(string name) : name_(name) {}
void describe() { cout << "Sensor: " << name_ << endl; }
virtual double readRange() { return 0.0; }
~Sensor() { cout << "Destroying " << name_ << endl; }
protected:
string name_;
};
class Lidar : public Sensor {
public:
Lidar() : Sensor("Lidar") {}
double readRange() override { return 120.5; }
int* buffer = new int[1024];
~Lidar() { delete[] buffer; cout << "Destroying Lidar buffer" << endl; }
};
class Camera : public Sensor {
public:
Camera() : Sensor("Camera") {}
double readRange() override { return 80.0; }
};
class StereoCamera : public Camera, public Sensor {
public:
StereoCamera() : Camera(), Sensor("StereoCamera") {}
};
void printRange(Sensor s) {
cout << s.readRange() << endl;
}
int main() {
Sensor* fleet[2];
fleet[0] = new Lidar();
fleet[1] = new Camera();
for (int i = 0; i < 2; i++) {
fleet[0]->describe();
cout << fleet[i]->readRange() << endl;
}
Lidar lidar;
printRange(lidar);
for (int i = 0; i < 2; i++) {
delete fleet[i];
}
return 0;
}
Write out, line by line, exactly what this program prints when it runs, and explain why. Then say what you would change about the class design and why each change matters.
Because deletion through Sensor* has undefined behavior, distinguish guaranteed output from behavior that cannot be specified portably.
def analyze_sensor_program(request):