2011-02-16 84 views
7

当对抽象类有引用时,这意味着什么? 我在代码中找到它,我无法理解它。对抽象类的引用

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

+2

这个问题太含糊。发布代码示例并解释它为什么会让您感到困惑。 – aschepler 2011-02-16 16:28:19

+0

这是否意味着在另一端可能有任何具体的子类? – Piskvor 2011-02-16 16:30:32

回答

13

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

6

抽象类被设计为派生自。 Liskov替换原则大致指出,使用从抽象基础派生的类型的抽象部分的任何内容都应该以多态方式使用基础同样适用。这意味着应该使用参考或指向基地的指针。

+3

+1将其链接到Liskov替代原则。这些有价值的提示指导新手去探索软件设计/编程的更深层领域,从而在相邻的隔间里更有能力的同事:) – 2011-02-16 17:20:31

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

barpointer到的抽象类。它可以使用*运算符取消引用并作为reference传入call_foo,因为那是call_foo要求的内容(Abstract*将要求指针,而Abstract&要求引用)。

在上述中,参照抽象类被传递,并且当foo()使用.符号(而不是指针->符号)调用,它打印Foo!,因为那是Implementation做什么。

希望这会有所帮助。

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