2015-05-05 19 views
5

Tôi cố gắng thực hiện các đối tượng functor đa hình (lớp cơ sở trừu tượng thuần túy và trẻ em) chỉ cho mục đích hiểu. Mục tiêu của tôi là tạo ra nhiều đối tượng của lớp cơ sở sử dụng các triển khai khác nhau của các hàm ảo thuần túy.C++ Tìm hiểu về sự đa hình của Functors

Khi tôi tạo một con trỏ của lớp cơ sở và đặt nó bằng một lớp con mới, tôi không thể gọi đối tượng là một hàm. Lỗi này là:

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

Đây là mã:

#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; 
} 

hiểu biết hiện tại của tôi là "foo * a" lưu trữ địa chỉ của các đối tượng chức năng "thanh" trong một (như thể hiện bởi câu lệnh cout). Do đó dereferencing nó "* a" nên cung cấp quyền truy cập vào chức năng mà "a" được trỏ đến và "* a()" nên gọi nó.

Nhưng không. bất cứ ai đó có thể trả lời tôi tại sao?

Trả lời

6

Vì bạn có một con trỏ cho a, bạn phải dereference nó để gọi() điều hành:

(*a)(); // Best use parentheseis around the dereferenced instance 
Các vấn đề liên quan