2016-11-29 52 views
0

因此,這裏是我的代碼我的工作:指向一個子類方法

#include <iostream> 

class Node 
{ 
public: 
    void speak(){std::cout << "I'm a base node" << std::endl;} 
}; 

class Child : public Node 
{ 
public: 
    void speak(){std::cout << "I'm a child node" << std::endl;} 
}; 

int main() 
{ 
    Node node; 
    Child child; 

    node.speak(); 
    child.speak(); 

    std::cout << "= Pointers..." << std::endl; 
    Node* pnode = &node; 
    Node* pchild = &child; 

    pnode->speak(); 
    pchild->speak(); 
} 

而這裏的輸出:

I'm a base node 
I'm a child node 
= Pointers... 
I'm a base node 
I'm a base node 

pchild->speak();調用Node的方法,而不是Child是一個。

現在我的問題是,我可能有許多不同類型的節點,具有不同數量的連接。因此我不能聲明一個帶有ChildX類的成員指針,但只能使用通用的Node類。但是每個節點都會有一個我想調用的方法。

我試着有一個指向該方法本身而不是類的指針(因爲它總是int (*foo)()類型),但編譯器抱怨invalid use of non-static member function

所以我的兩種方法都不起作用。無論是指向類的指針,還是指向類成員函數的指針。

回答

1

熟悉virtual functions and polymorphism - 這兩個關鍵概念在C++中。

在你的問題,你只需要簡單地定義

virtual void speak(){std::cout << "I'm a base/child node" << std::endl;} 
+0

哦,這解釋了一些事情。我讀過它用於解決菱形多重繼承問題,但這並沒有描繪整個故事。謝謝 – JonnyRobbie

+0

確保您不要將虛擬繼承與虛擬功能混合在一起。鑽石比虛擬功能更進步。 https://en.wikipedia.org/wiki/Virtual_inheritance – kabanus

相關問題