【发布时间】:2013-07-21 04:53:14
【问题描述】:
这是一个 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()。
我试图在 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 代码?
【问题讨论】:
-
在 Python 中不是很有趣。它只是尝试(动态地)通过 MRO(方法解析顺序)树解析给定的属性(由于所有不同的规则,它比仅仅查找属性要复杂一些,但它是关于如何总结它)。树 MR(方法解析)总是从接收者开始,接收者是使用 self 时的当前对象实例——这也是 Python 允许覆盖和多态的方式——而不是方法的定义类型。要调用特定类型的方法,请参阅
TheType.method(self, ..) -
@user2246674:当类不是“新样式”(即派生自
object)时是这样吗?如果这很重要,那么应该编辑答案。 -
看来我来晚了....这可以使用“类型特征”(C++ 模板编程概念)来完成。想法是 B2 类可以从 TypeTrait 派生或包含模板类作为参数。 D 的构造函数可以传递自己来设置实例变量,然后调用 f1 方法。
标签: c++ python multiple-inheritance virtual-functions