Wenn Sie unterschiedliche öffentliche Schnittstellen für ein und dasselbe Objekt haben möchten, können Sie virtuelle Basisklassen verwenden. Aber diese haben Overhead (Speicher und Speicherplatz).
Code: Select all
class View1 {
public:
int x;
}
class View2 : virtual public View1 {
public:
int y;
}
class View3 {
public:
int* a;
}
class Complex : virtual public View1, virtual public View2, virtual public View3 {
}
Man könnte das Objekt in eine Klasse mit unterschiedlichen Zugriffsmodifikatoren und gleicher Größe umwandeln. Dies erfolgt häufig in einfachem C mit Strukturen zum Ausblenden von Implementierungsdetails. Bei dieser Lösung handelt es sich jedoch um ein von Natur aus unsicheres und undefiniertes Verhalten mit möglicherweise sehr schwer zu findenden Fehlern, da der Optimierer, wenn er seine Aufgabe erfüllt, möglicherweise nicht gut mit verbotenem Aliasing (derselbe Speicherort mit unterschiedlichen Namen) umgehen kann. Und einige Compiler können das Speicherlayout neu anordnen, wenn die Zugriffsmodifikatoren unterschiedlich sind. Umwandlungen wie „dynamic_cast“, „reinterpret_cast“ und „bit_cast“ sind nur für bestimmte Klassen zulässig.
Code: Select all
class View1 {
public:
int x;
private:
int y;
int* a;
}
class Complex {
public:
int x;
int y;
int* a;
}
Jetzt habe ich mindestens eine Lösung gefunden, die Superklassen anstelle von Basisklassen als Schnittstelle verwendet und legal zu sein scheint. Stimmt das? Gibt es einen einfacheren Weg dorthin?
Complex.h:
Code: Select all
#pragma once
#include
class Complex {
protected:
Complex(int v) : x(0), y(0), a(new int) { *a = v };
~Complex() { std::cout