2015-05-05 22 views
5

Polimorfik functor nesnelerini (salt soyut temel sınıf ve çocuklar) sadece anlama amacıyla uygulamaya çalışıyorum. Amacım, saf sanal işlevlerin farklı uygulamalarını kullanan temel sınıfın birçok nesnesini oluşturmaktır.C++ Tanımlayıcılar Polimorfizmini Anlama

Temel sınıfın bir işaretçisini oluşturduğumda ve bunu yeni bir çocuk sınıfına eşit olarak ayarladığımda, nesneyi bir işlev olarak çağıramam. hatadır: Burada

main.cpp:29:7: error: ‘a’ cannot be used as a function 

kodudur:

#include <iostream> 

class foo{ 
public: 
    virtual void operator()() = 0; 
    virtual ~foo(){} 
}; 

class bar: public foo{ 
public: 
    void operator()(){ std::cout << "bar" << std::endl;} 
}; 

class car: public foo{ 
public: 
    void operator()(){ std::cout << "car" << std::endl;} 
}; 


int main(int argc, char *argv[]) 
{ 

    foo *a = new bar; 
    foo *b = new car; 

    //prints out the address of the two object: 
    //hence I know that they are being created 
    std::cout << a << std::endl; 
    std::cout << b << std::endl; 

    //does not call bar() instead returns the error mentioned above 
    //I also tried some obscure variation of the theme: 
    //*a(); *a()(); a()->(); a->(); a()(); 
    //just calling "a;" does not do anything except throwing a warning 
    a(); 

    //the following code works fine: when called it print bar, car respectivly as expected 
    // bar b; 
    // car c; 
    // b(); 
    // c(); 

    delete b; 
    delete a; 
    return 0; 
} 

Benim şimdiki anlayış olduğunu "foo * Bir" mağazaları ile gösterildiği gibi bir işlevi nesnesi "bar" nin adresi (cout ifadesi). Bundan dolayı, "a" işareti, "a" nın işaret ettiği işleve "* a()" denmesi gereken işleve erişim sağlamalıdır.

Ama öyle değil. Birisi bana nedenini söyleyebilir mi?

cevap

6

Eğer a için bir işaretçi olduğundan, bunu() operatörü aramak gerekir KQUEUE:

(*a)(); // Best use parentheseis around the dereferenced instance 
İlgili konular