Quello che stai dicendo è un po 'vago e un esempio sarebbe utile. In particolare dal momento che usi la parola static, e non è chiaro quale sia il suo contesto.
Non è possibile impedire a una classe derivata di ereditare tutti i metodi di una classe base. Il meglio che puoi fare è renderlo un non membro che richiede il parametro dell'oggetto base. Quindi dovresti downcast l'oggetto prima di chiamare, ma puoi comunque chiamarlo.
Quello che stai suggerendo sembra essere una violazione del principio di sostituzione di Liskov. Il che significa che dovresti ripensare il tuo design.
Inoltre anziché B che eredita da A. È possibile che si desideri una classe di base Q da cui derivano sia A che B. [1]
[1] Q è uno scherzo, alcuni studiosi di bibbia pensano che ci sia un libro comune che non è stato detto che chiamano Q da cui ogni vangelo è copiato.
Modifica: aggiuntiva.
Con l'esempio alcune cose sono più chiare. Consentitemi di apportare alcune correzioni di base alla vostra comprensione del C++. Hai detto, hai diversi metodi di creazione statici a causa di conflitti tra argomenti. Penso che sia meglio dire che l'overloading non può risolvere i diversi metodi di costruzione. La risposta è molto semplice: espandi il sovraccarico in due modi. Usa enumerazioni o usa le classi. La prima si può vedere in stream chiamando lettura/aggiungere/lettura-scrittura flussi di tipo aggiungendo ios :: ate ecc
Nel tuo caso:
enum BCT {halfLength,fullLength,quarterLength ...};
poi fare Banana statico Create (dimensioni del galleggiante , BCT type = fullLength) { switch (type) { case fullLength: return Banana (size); caso halfLength: return Banana (size * 2); trimestre cassa Lunghezza: ritorno Banana (misura * 4); ... }}
la versione alternativa è quella di utilizzare le classi per distinguere i tipi di parametri (credo James Coplien chiamato questi esemplari)
class FullLength
class HalfLength
class QuarterLength
Poi:
static Banana Create(float length); // Full length
static Banana Create(float halfLength, HalfLength &dummy);
static Banana Create(float quarterlength, QuarterLength &dummy);
Il nuovo le classi non aggiungono nulla al sovraccarico, ma rimuovono l'ambiguità di sovraccarico. Credo che boost/std :: filesystem usi in questo modo per i suoi iteratori di directort.
Detto questo, una volta deciso come creare istanze, questi non devono essere membri statici. Possono essere costruttori ordinari e questo risolverà il tuo problema. Per la maggior parte. Non sarai ancora in grado di impedire ad AdvancedBanana di implementare un metodo di creazione a metà lunghezza, ma il programmatore saprà che lo sta facendo.
Una breve nota su statica, le funzioni membro statiche sono quelli che non accedono al puntatore questo o ciò che alcuni chiamano lingue sé, cioè non accedere ai membri di una particolare istanza. Infatti, in preC++ 98 giorni, prima che avessero statici, ciò che le persone facevano era di fare qualcosa di simile: ((Banana *)NULL)->static_function(arguments);
Nel tuo esempio, è meglio usare i costruttori in primo luogo. i costruttori statici sono meglio lasciati per cose come le fabbriche dove sono veramente necessarie.
Inoltre, nella risposta di Mido la linea: a.CreateByHalfLength(1);
può o non può compilare, io uso tante tante lingue, a volte mi confondo da ciò che è illegale :(ma è mostra pensiero cattivo Il modo corretto per chiamare una statica sarebbe. essere Banana :: CreateByHalfLength (1), non a seconda un'istanza
Cosa farebbe in realtà? Suppongo che tu voglia 'Derived :: constructBase (args, go, here)' per non funzionare? (se 'constructBase' è un metodo statico su' Base', e 'Derived' estende' Base') – immibis
Se l'ho lasciato così com'è, Creerebbe solo un'istanza dell'oggetto base. Non c'è nulla di male in questo, solo confusione. Anche i metodi sono chiamati "CreateByXYZWLH" o "CreateByRxRy" ecc che sono applicabili anche alla classe derivata, quindi potrei voler riutilizzare i nomi. – user81993
@immibis La risposta mi sembra diretta. Se non sbaglio, che ne dici di utilizzare una parola chiave privata? – Nabin