[英]Multiple inheritance same method name and no ambiguity
我有两个类(A0和A1),它们具有一个函数foo(),而一个A0具有一个函数bar(),它仅调用foo()。 还有从A0和A1继承的B类。
除了从A0和A1继承外,B不执行任何操作。
为什么在调用B->bar()
时没有歧义?
一小段代码示例
class A0
{
protected:
/*virtual*/ void foo() {std::cout << "A0" << std::endl; }
public:
void bar() {foo(); }
};
class A1
{
protected:
/*virtual*/ void foo() {std::cout << "A1" << std::endl; }
};
class B : public A0, public A1
{
protected:
//virtual void foo() override {A1::foo(); }
};
int main()
{
B *lPtr = new B;
lPtr->bar(); //"A0" without the override, "A1" with the override
delete lPtr;
return 0;
}
而且,如果我取消注释虚函数和函数重写,则仍然没有歧义,但会调用另一个foo。
为什么仍然没有歧义,为什么又称另一个歧义?
如果您有virtual
,则您的vtable中有两个foo
。
第一个是A0::foo
,第二个是A1::foo
。
当您在B
覆盖foo
时,您将覆盖两者 ,并指示它调用A1::foo()
。
如果不重写foo
中B
,这两个foo
S保持存储在虚表,除了按名称无关。
在A0::bar
,当您调用foo()
它将在本地查找foo
。 它看到一个A0::foo
是虚拟的。 因此,它将调用编码到vtable中以执行A0::foo
。
如果B
没有覆盖,则调用A0::foo
。 有了B
的覆盖,它会在调用A1::foo
时调用B::foo
。
在您没有virtual
的情况下,除了vtable
位之外,其他保持不变。
您有两个函数A0::foo
和A1::foo
。 使用指向A0
的指针, ->foo()
调用A0::foo
。
使用指向B
的指针, ->foo()
是不明确的。
如果编写B::foo
方法(是否为虚拟方法无关紧要),则B->foo()
调用它。
两件事共享一个名字的事实并不意味着它们是同一件事,也不意味着所有调用都是模棱两可的。
仅当您无法从上下文中命名哪个调用时,这些调用才是模棱两可的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.