C++
Beginner
1 min read
Multiple Inheritance and the Diamond Problem
Example
#include <iostream>
// Common base
class Device {
public:
virtual ~Device() = default;
void powerOn() const { std::cout << "Device powered on\n"; }
};
// Two intermediate classes — use virtual inheritance
class Scanner : virtual public Device {
public:
void scan() const { std::cout << "Scanning document\n"; }
};
class Printer : virtual public Device {
public:
void print() const { std::cout << "Printing document\n"; }
};
// Diamond: inherits Scanner and Printer — only ONE Device subobject
class AllInOne : public Scanner, public Printer {
public:
void doAll() const {
powerOn(); // unambiguous — single Device subobject
scan();
print();
}
};
// Interface (abstract class) — preferred over deep hierarchies
class ISerializable {
public:
virtual std::string serialize() const = 0;
virtual ~ISerializable() = default;
};
class Document : public ISerializable {
public:
explicit Document(const std::string& text) : text_(text) {}
std::string serialize() const override { return text_; }
private:
std::string text_;
};
int main() {
AllInOne aio;
aio.doAll();
ISerializable* doc = new Document("Hello, world");
std::cout << doc->serialize() << "\n";
delete doc;
return 0;
}