[英]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
的子類的一部分。
龍答:可以,如果你使用一些難看的向下轉換(基本上是鑄造this
為D*
)。 但這可能不是一個好主意,因為*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.