C++ 理解函子多态性
C++ Understanding Functors Polymorphism
我尝试实现多态仿函数对象(纯抽象基 class 和子对象)仅用于理解目的。我的目标是创建许多使用纯虚函数的不同实现的基础 class 对象。
当我创建基 class 的指针并将其设置为等于新子 class 时,我无法将该对象作为函数调用。错误是:
main.cpp:29:7: error: ‘a’ cannot be used as a function
代码如下:
#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;
}
我目前的理解是"foo *a"将函数对象"bar"的地址存放在a中(如cout语句所示)。因此取消引用它“*a”应该提供对"a"指向的函数的访问,“*a()”应该调用它。
但事实并非如此。谁能告诉我为什么?
因为你有一个指向 a
的指针,你必须取消引用它来调用 () 运算符:
(*a)(); // Best use parentheseis around the dereferenced instance
当你取消引用 a 你丢弃了多态性时,应该调用 foo::operator()
而不是 bar::operator()
,因此 纯虚函数调用异常 抛出。
我尝试实现多态仿函数对象(纯抽象基 class 和子对象)仅用于理解目的。我的目标是创建许多使用纯虚函数的不同实现的基础 class 对象。
当我创建基 class 的指针并将其设置为等于新子 class 时,我无法将该对象作为函数调用。错误是:
main.cpp:29:7: error: ‘a’ cannot be used as a function
代码如下:
#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;
}
我目前的理解是"foo *a"将函数对象"bar"的地址存放在a中(如cout语句所示)。因此取消引用它“*a”应该提供对"a"指向的函数的访问,“*a()”应该调用它。
但事实并非如此。谁能告诉我为什么?
因为你有一个指向 a
的指针,你必须取消引用它来调用 () 运算符:
(*a)(); // Best use parentheseis around the dereferenced instance
当你取消引用 a 你丢弃了多态性时,应该调用 foo::operator()
而不是 bar::operator()
,因此 纯虚函数调用异常 抛出。