Schnittstellen zur Kompilierungszeit (nicht virtuell)C++

Programme in C++. Entwicklerforum
Anonymous
 Schnittstellen zur Kompilierungszeit (nicht virtuell)

Post by Anonymous »

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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post