簡體   English   中英

Python與C ++中的多重繼承

[英]Multiple inheritance in python vs c++

這是一個Python和C ++問題。

我正在嘗試多重繼承,並且遇到了這個示例。

B1 B2
 \ /
  D

說我有兩個(獨立的)父類B1, B2和一個子類D 我們只對class D對象感興趣。

class B1:
    def f1(self):
        print "In f1"

class B2:
    def f2(self):
        self.f1()

class D (B1, B2):
    def fD(self):
        self.f2()

d = D()
d.fD()

Output: In f1

有趣的是(至少對我而言)是, class B2不了解class B1 ,但是f2可以self.f1()調用self.f1()

我試圖在C ++中復制這個確切的東西,但由於我不知道如何從f2調用f1 ,所以無法使其正常工作。

class B1 {
    public:
    virtual ~B1() {}
    virtual void f1() { cout << "In f1" << endl; }
};

class B2 {
    public:
    virtual ~B2() {}
    virtual void f2() { /* What goes here?? */ }
};

class D : public B1, public B2 {
    public:
    void fD() { f2(); }
};

因此,我想知道Python如何/為什么可以處理此問題,而C ++不能?

另外,我們可以對C ++代碼進行哪些最小的更改以使其表現得像Python代碼一樣?

我們可以對C ++代碼進行哪些最小的更改以使其表現得像Python代碼?

簡短的回答:不能。 B2不知道它將成為B1的子類的一部分。

龍答:可以,如果你使用一些難看的向下轉換(基本上是鑄造thisD* )。 但這可能不是一個好主意,因為*this不一定是D

這在python中有效,因為在運行時解析了類B2的名稱f1 這就是“鴨式打字”- self的對象引用只需要具有一個有效的f1即可調用,就可以通過這種方式構造它。

在C ++中獲得類似行為的最類似於C ++的方式是Curiously recurring template pattern 您的B2 C ++版本需要知道它的組成部分。 使它成為其派生類型的模板,可以為您提供一種“干凈”的方式來執行其他人建議的dynamic_cast 之所以比較干凈,是因為從它派生的每個類都會有一個新的類B2<T> 每個專長都有一個不同的f2 ,它使用正確的強制轉換來獲得正確的f1 它會像python版本一樣工作,因為只需要存在一個可調用的f1 (盡管在編譯時而不是在運行時)。

class B1 {
    public:
    virtual ~B1() {}
    virtual void f1() { cout << "In f1" << endl; }
};

template <typename Derived>
class B2 {
    public:
    virtual ~B2() {}
    virtual void f2() { dynamic_cast<Derived *>(this)->f1(); }
};

class D : public B1, public B2<D> {
    public:
    void fD() { f2(); }
};

我想知道為什么/為什么Python可以解決這個問題,但是C ++無法解決?

那是因為Python是動態類型的,而C ++是靜態類型的。

我們可以對C ++代碼進行哪些最小的更改以使其表現得像Python代碼?

如果要使用Python編程,則知道在哪里可以找到它。 使用Python方式在C ++中進行編程是反習慣的,通常對此不予理會。 也就是說,如果仍然要執行此操作,請使用dynamic_cast<B2*>(this)

暫無
暫無

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

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