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?