将引用作为参数传递给抽象类中的方法

时间:2014-10-12 15:15:04

标签: c++ oop

我定义了一个名为Polygon的抽象基类,它包含一个带有签名的方法,如

int operator==(Polygon other)

编译时出现错误

cannot declare parameter ‘other’ to be of abstract type ‘Polygon’

这是预期的,因为Polygon是一个抽象类,不能有对象。然而,当我用'& other'替换'other'时,编译的代码甚至给出了预期的结果。

从堆栈溢出的其他帖子我明白当我定义一个带有'&'前面的参数的函数创建传递参数的别名。现在我有一个名为'other'的'Polygon'类型的变量,它不仅仅是一个指针。如果Polygon是ABC,这怎么会发生?这样的代码从标准的角度来看是否有效?

3 个答案:

答案 0 :(得分:2)

  

从堆栈溢出的其他帖子我明白当我定义一个带有'&'前面的参数的函数创建了传递参数的别名。

正确的术语是“引用”而不是“别名”(这意味着在C ++中有所不同)。

  

现在我有一个名为'other'的变量'Polygon',它不仅仅是一个指针。

不,other的类型是Polygon&,即引用到Polygon。你是对的,它不是一个指针,但在许多方面它的行为就像一个指针。指针和引用之间的主要区别在于引用永远不会指向任何内容(而指针可以),并且引用不能更改为在创建后指向不同的内容。

  

如果Polygon是ABC,怎么会发生这种情况?

Polygon是一个抽象基类,因此您无法单独创建一个基类。但是,假设您有一个类似Rectangle的具体类,它继承自Polygon。当您将矩形实例传递给operator==(Polygon& other)时,您正在引用Polygon内的Rectangle {{1}},这很好。

  

从标准的角度来看,此类代码是否有效。

这种“参考多态”不仅有效,而且对于C ++的工作方式也是绝对必要的。

答案 1 :(得分:1)

首先,您的问题并不清楚您打算提出什么问题。至于抽象基类,你不能使用普通对象作为函数参数。

你绝对可以使用引用/指针来抽象类,通过它可以调用派生类的虚函数。例如

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(); }

答案 2 :(得分:0)

References in c++ behave like hidden pointers。使用指针可以获得相同的多态行为,您可以通过引用来实现。

对抽象类的引用就像指向抽象类的指针:它需要引用抽象类的某些非抽象子类的对象。您可以使用类似的引用来使用.语法在引用的类上调用虚方法。