2016-04-10 12 views
0

ich verwenden, um diesen Betreiber Überlastung in der Klasse Basis:Betreiber Überlastung „neuen“ C++

void* operator new(std::size_t sz1) { 
//Se llama a la funcion de xMemoryManager 
// std::printf("global op new called, size = %zu\n",sz); 
cout<<"operador new"<<endl; 

}

Aber ich abgeleitete Klasse von Basisklasse bin erben, und ich habe diesen Code in abgeleiteten Klasse :

xPointer<Pruebas> *xPruebas; 
xPruebas=new xPointer<Pruebas>; 
xPointer<Pruebas> *xPruebas1; 
xPruebas1=new xPointer<Pruebas>; 

Nun, in diesen Zeilen muß ich neu den primitiven Operator verwenden, nicht die Überlastung Betreiber der Basisklasse.

Wie kann ich das tun?

Antwort

1

Schreiben Sie eine operator new für die abgeleitete Klasse und rufen Sie darin ::operator new.

1

Sie müssen operator new Funktionen in der abgeleiteten Klasse überschreiben. Hier sind zwei Strategien, die ich mir vorstellen konnte. Das Programm unten zeigt, wie man sie benutzt.

#include <iostream> 
#include <cstdint> 
#include <cstdlib> 
#include <new> 

struct Base 
{ 
    void* operator new(std::size_t sz) 
    { 
     return malloc(sz); 
    } 
}; 

struct Derived1 : Base 
{ 
    // Simple override. 
    void* operator new(std::size_t sz) 
    { 
     return ::operator new(sz); 
    } 
}; 

struct Derived2 : Base 
{ 
    // Can be used as placement new. 
    void* operator new(std::size_t sz, void* p) 
    { 
     return p; 
    } 
}; 

int main() 
{ 
    // Use operator new in the basic form. 
    Derived1* ptr1 = new Derived1; 
    std::cout << ptr1 << std::endl; 

    // Use operator new in the placement new form. 
    // Allocate memory for the object first using global operator new. 
    // Then call the placement new. 
    void* p = ::operator new(sizeof(Derived2)); 
    Derived2* ptr2 = new (p) Derived2; 
    std::cout << ptr2 << std::endl; 
} 
+0

Vielen Dank, diese Lösung funktioniert! –