簡體   English   中英

函數可以接受抽象基類作為參數嗎?

[英]Can functions accept abstract base classes as arguments?

熟悉了基本類和封裝的概念后,我開始着手了解多態性,但我無法弄清楚如何使它起作用。 我搜索過的許多示例都非常非常強制(類 Foo 和 Bar 對我來說太抽象了,無法看到實用程序),但這是我對基本概念的理解:您編寫一個基類,派生一個來自它的一大堆其他東西改變了基本方法的作用(但不是它們“是什么”),然后你可以編寫通用函數來接受和處理任何派生類,因為你已經在某種程度上標准化了它們的外觀。 在這個前提下,我嘗試實現基本的 Animal->cat/dog 層次結構,如下所示:

class Animal {
  public:
    virtual void speak() = 0;
};

class Dog : public Animal {
  public:
    void speak() {cout << "Bark bark!" << endl;}
};

class Cat : public Animal {
  public:
    void speak() {cout << "Meow!" << endl;}
};

void speakTo(Animal animal) {
    animal.speak();
}

說話可以采取的地方可以采取一般的動物並使它,好吧,說話。 但據我所知,這不起作用,因為我無法實例化 Animal (特別是在函數參數中)。 那么,我問,我是否了解多態性的基本用途,我如何才能真正做到我已經嘗試做的事情?

您不能將Animal對象傳遞給派生類函數,因為您不能創建Animal類等的對象,它是一個Abstract 類
如果一個類至少包含一個純虛函數( speak() ),那么這個類就變成了一個抽象類,你不能創建它的任何對象。 但是,您可以創建指針或引用並將它們傳遞給它。 您可以傳遞一個Animal指針或對該方法的引用。

void speakTo(Animal* animal) 
{
    animal->speak();
}

int main()
{
    Animal *ptr = new Dog();
    speakTo(ptr);

    delete ptr;   //Don't Forget to do this whenever you use new()
    return 0;
}

您將需要傳遞引用而不是副本:

void speakTo(Animal& animal) {
    animal.speak();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM