对抽象类的引用

时间:2011-02-16 16:23:21

标签: c++ reference abstract

当引用抽象类时,它是什么意思? 我在代码中发现它,我无法理解它。

我认为抽象类无法实例化。你怎么能给它一个参考?

4 个答案:

答案 0 :(得分:13)

对抽象类的引用就像指向抽象类的指针:它需要引用抽象类的某些非抽象子类的对象。您可以使用类似的引用使用.语法在引用的类上调用虚方法,其方式类似于Java中接口的指针。

答案 1 :(得分:8)

抽象类旨在派生自。 Liskov替换原则粗略地指出,使用从抽象基础派生的类型的抽象部分的任何东西都应该同样好地使用基本多态。这意味着应该使用引用或指向基数的指针。

答案 2 :(得分:6)

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

class Implementation : public Abstract
{
public:
  void foo() { std::cout << "Foo!" << std::endl; }
};

void call_foo(Abstract& obj) { obj.foo(); } 

int main()
{
  Abstract *bar = new Implementation();

  call_foo(*bar);

  delete bar;
}

bar是抽象类的pointer。它可以使用*运算符取消引用,并作为reference传递到call_foo,因为这是call_foo要求的内容(Abstract*会要求一个指针,而Abstract&要求引用。)

在上面,传递了对抽象类的引用,并且当使用foo()表示法(而不是指针.表示法)调用->时,它会打印{{ 1}},因为这就是Foo!的作用。

希望这有帮助。

答案 3 :(得分:2)

c ++中的引用(几乎)像隐藏指针一样。特别是,您可以使用指针获得相同的多态行为,您可以使用引用来实现它。也就是说,以下是(几乎)等价的

int *i = &a;
int &j = a;

假设a是前一行中某处定义的整数。在出现参考j之后,完全等同于(* i)的出现。主要区别在于引用不会给你带来内存管理的痛苦,而指针就是这样(你有责任处理新的和删除)。此外,指针不必指向某个东西,而如果引用不是指任何东西,则它不能存在。除此之外,您可以认为它们的行为方式相同。

因此,引用抽象对象是绝对合法的。您将经常在函数签名中找到它,其中多态行为可以通过引用或指针实现。但引用提供了更轻松的语法,如下面的代码片段

A a;
A* ptr = &a;
A& ref = a;
ref();
ptr->operator()();
(*ptr)();

假设A类重载operator ()