2013-05-15 5 views
7

Jestem nowym programistą C++, mam pewne wątpliwości podczas wykonywania niektórych programów w C++, w ten sposób uzyskuje się dynamiczne wiązanie dla funkcji statycznego elementu. Dynamiczne wiązanie normalnych funkcji składowych można uzyskać deklarując funkcje członkowskie jako wirtualne, ale nie możemy zadeklarować funkcji statycznych jako wirtualnych, więc proszę o pomoc. i proszę zobaczyć poniżej:Dziedziczenie funkcji statycznych członków

#include <iostream> 
#include <windows.h> 
using namespace std; 

class ClassA 
{ 
    protected : 
    int width, height; 
    public: 
    void set(int x, int y) 
    { 
     width = x, height = y; 
    } 
    static void print() 
    { 
     cout << "base class static function" << endl; 
    } 
    virtual int area() 
    { 
     return 0; 
     } 
}; 

class ClassB : public ClassA 
{ 
    public: 
    static void print() 
    { 
    cout << "derived class static function" << endl; 
    } 
    int area() 
    { 
    return (width * height); 
    } 
}; 

int main() 
{ 
    ClassA *ptr = NULL; 
    ClassB obj; 
    ptr = &obj ; 
    ptr->set(10, 20); 
    cout << ptr->area() << endl; 
    ptr->print(); 
    return 0; 
} 

W powyższym kodzie mam przypisanego pochodnego obiekt klasy do wskaźnika i wzywającą wydruk funkcja składowa statyczna(), ale jest to wywołanie funkcji klasy bazowej więc jaki sposób można osiągnąć dynamiczny bind dla statycznej funkcji składowej.

Odpowiedz

7

Wymagane połączenie dynamiczne to zachowanie niestatyczne.

Dynamiczne wiązanie jest wiążąca na podstawie wskaźnika this i static funkcje z definicji nie potrzebują lub wymagają this wskaźnik.

Zakładając, że funkcja ta ma być statyczna w innych sytuacjach (nie musi być statyczna w twoim przykładzie), możesz zawinąć funkcję statyczną w funkcję niestatyczną.

class ClassA 
{ 
    // (the rest of this class is unchanged...) 

    virtual void dynamic_print() 
    { 
     ClassA::print(); 
    } 
}; 

class ClassB : public ClassA 
{ 
    // (the rest of this class is unchanged...) 

    virtual void dynamic_print() 
    { 
     ClassB::print(); 
    } 
}; 
+0

ładne! lubię to. –

1

Wiązanie dynamiczne nie ma większego sensu, ponieważ nie potrzebujesz nawet obiektu do wywołania funkcji statycznej.

1

Nie można uczynić metod statycznych jako wirtualnymi. Po prostu ustaw metodę drukowania jako wirtualną (podobnie jak metoda obszaru). Byłby to twój cel.

3

Masz tutaj dwie kwestie: po pierwsze nie możesz używać dziedziczenia z funkcjami statycznymi. Po drugie, brakuje słowa kluczowego virtual, aby poinformować kompilator, że ta funkcja może zostać nadpisana przez klasy potomne.

Zakładając, że rozwiązałeś problem statyczny.

virtual void print(){...}