1.
#include <iostream>
using namespace std;
class OS {
public:
virtual void Install() = 0;
};
class LinuxOS : public OS {
public:
virtual void Install() { cout<<"Install Linux OS"<<endl; }
};
class WindowsOS : public OS {
public:
virtual void Install() { cout<<"Install Windows OS"<<endl; }
};
class Computer {
public:
virtual void printInfo() = 0;
};
class MAC : public Computer {
public:
virtual void printInfo() { cout<<"This is MAC, ";}
};
class MacWithLinux : public MAC, public LinuxOS {
public:
void InstallOS() { printInfo(); Install(); }
};
class MacWithWindows : public MAC, public WindowsOS {
public:
void InstallOS() { printInfo(); Install(); }
};
class Lenovo : public Computer {
public:
virtual void printInfo() { cout<<"This is Lenovo, ";}
};
class LenovoWithLinux : public Lenovo, public LinuxOS {
public:
void InstallOS() { printInfo(); Install(); }
};
class LenovoWithWindows : public Lenovo, public WindowsOS {
public:
void InstallOS() { printInfo(); Install(); }
};
int main()
{
MacWithLinux a;
a.InstallOS();
LenovoWithWindows b;
b.InstallOS();
return 0;
}
2.非常容易扩展,不用那么多派生类,两边随便发展,互不影响
类里面放一个指针,指向另外一个对象
#include <iostream>
using namespace std;
class OS {
public:
virtual void InstallOS_impl() = 0;
};
class LinuxOS : public OS {
public:
virtual void InstallOS_impl() { cout<<"Install Linux OS"<<endl; }
};
class WindowsOS : public OS {
public:
virtual void InstallOS_impl() { cout<<"Install Windows OS"<<endl; }
};
class UnixOS : public OS {
public:
virtual void InstallOS_impl() { cout<<"Install Unix OS"<<endl; }
};
class Computer {
public:
virtual void printInfo() = 0;
virtual void InstallOS() = 0;
};
class MAC : public Computer {
public:
virtual void printInfo() { cout<<"This is MAC, ";}
MAC(OS *impl) { this->impl = impl; } //构造函数
void InstallOS() { printInfo(); impl->InstallOS_impl(); };
private:
OS *impl;
};
class Lenovo : public Computer {
public:
virtual void printInfo() { cout<<"This is Lenovo, ";}
Lenovo(OS *impl) { this->impl = impl; }
void InstallOS() { printInfo(); impl->InstallOS_impl(); };
private:
OS *impl;
};
int main()
{
OS *os1 = new LinuxOS();
OS *os2 = new WindowsOS();
OS *os3 = new UnixOS();
Computer *c1 = new MAC(os1);
Computer *c2 = new Lenovo(os2);
Computer *c3 = new Lenovo(os3);
c1->InstallOS();
c2->InstallOS();
c3->InstallOS();
return 0;
}