2016-04-19 7 views
0

Ich habe zwei generische Klassen (Stack und Queue), Und wie die meisten Funktionsnamen von Stack (Assesume es die Basisklasse) kann verwendet, und ich würde für diese Funktionen in Stack und QueueMüssen die Basis-Klasse-Member-Funktionen in abgeleiteten Klasse in Generische Programmierung re-deklarieren

#ifndef STACK_H 
#define STACK_H 
template<class T> 
class myStack{ 
private: 
    T *s; 
    int top,s_size; 
public: 
    myStack(int k=40); 
    ~myStack(); 
    void push(T x); 
    T pop(); 
    int isEmpty(); 
    int isFull(); 
    T peek(); 
    void display(); 
}; 
#endif // STACK_H 

und darunter ist die Warteschlange Klassenheaderdatei

#ifndef MYQUEUE_H 
#define MYQUEUE_H 
#include "stack.h" 


template <class T> 
class myQueue : public myStack<T> 
{ 
    private: 
     int f,r; 
    public: 
     void push(T x); 
     int isEmpty(); 
     int isFull(); 
     void display(); 
     myQueue(int k=40); 
     T del(); 
     T last(); 
     T first(); 
     virtual ~myQueue(); 

}; 

#endif // MYQUEUE_H 

Sein eigener Logik offensichtlich, dass ich erklärt haben, die unten Funktionen wieder, ohne die mein Code kann nicht kompiliert werden, ist es wirklich notwendig, sie erneut zu deklarieren die abgeleitete Klasse eine separate Logik haben, oder kann ich nur diese Funktionen in abgeleiteten Klasse verwenden, ohne sie in Header mit, da die Funktionen bereits

 int isEmpty(); 
     int isFull(); 
     void display(); 

Im Folgenden wird vererbt wird der Fehler aufgetreten ist, wenn ich sie nicht erklären erneut in abgeleiteten Klasse

||=== Build: Debug in Data_Structures (compiler: GNU GCC Compiler) ===| 
C:\Users\xprk569\Data_Structures\src\myQueue.cpp|13|error: no 'void myQueue<T>::display()' member function declared in class 'myQueue<T>'| 
C:\Users\xprk569\Data_Structures\src\myQueue.cpp|34|error: no 'void myQueue<T>::push(T)' member function declared in class 'myQueue<T>'| 
C:\Users\xprk569\Data_Structures\src\myQueue.cpp|41|error: no 'int myQueue<T>::isEmpty()' member function declared in class 'myQueue<T>'| 
C:\Users\xprk569\Data_Structures\src\myQueue.cpp|46|error: no 'int myQueue<T>::isFull()' member function declared in class 'myQueue<T>'| 
||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===| 
+0

Sie meinen, Sie sind neu zu definieren 'isEmpty' für' myQueue' ohne es in 'myQueue' zu ​​erklären? – Holt

+0

@holt ja, genau – user2256825

Antwort

1

Wenn Sie ein Verfahren für ein Kind Klasse neu definieren möchten, müssen Sie es neu deklarieren, arbeiten die folgenden nicht:

struct A { 
    void foo() { } 
}; 

struct B: public A { }; 

// error: no 'void B::foo()' member function declared in class 'B' 
void B::foo() { } 

Beachten Sie auch, dass, wenn Sie die Verwendung von Polymorphismus (Überschreibung die Basismethode) machen wollen, müssen Sie Ihre Methode virtuell machen:

struct A { 
    virtual void foo() { } 
}; 

struct B: public A { 
    virtual void foo(); 
}; 

void B::foo() { } 

Die C++ 11 ein neues override Schlüsselwort eingeführt, den Sie mit um zu überprüfen, ob Sie wirklich zwingende:

struct A { 
    void foo() { } 
}; 

struct B: public A { 
    // error: 'void B::foo()' marked 'override', but does not override 
    void foo() override { } 
}; 
Verwandte Themen