我定义了一个名为Polygon的抽象基类,它包含一个带有签名的方法,如
int operator==(Polygon other)
编译时出现错误
cannot declare parameter ‘other’ to be of abstract type ‘Polygon’
这是预期的,因为Polygon是一个抽象类,不能有对象。然而,当我用'& other'替换'other'时,编译的代码甚至给出了预期的结果。
从堆栈溢出的其他帖子我明白当我定义一个带有'&'前面的参数的函数创建传递参数的别名。现在我有一个名为'other'的'Polygon'类型的变量,它不仅仅是一个指针。如果Polygon是ABC,这怎么会发生?这样的代码从标准的角度来看是否有效?
答案 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
。使用指针可以获得相同的多态行为,您可以通过引用来实现。
对抽象类的引用就像指向抽象类的指针:它需要引用抽象类的某些非抽象子类的对象。您可以使用类似的引用来使用.
语法在引用的类上调用虚方法。