繁体   English   中英

多重继承相同的方法名称,没有歧义

[英]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()

如果不重写fooB ,这两个foo S保持存储在虚表,除了按名称无关。

A0::bar ,当您调用foo()它将在本地查找foo 它看到一个A0::foo是虚拟的。 因此,它将调用编码到vtable中以执行A0::foo

如果B没有覆盖,则调用A0::foo 有了B的覆盖,它会在调用A1::foo时调用B::foo

在您没有virtual的情况下,除了vtable位之外,其他保持不变。

您有两个函数A0::fooA1::foo 使用指向A0的指针, ->foo()调用A0::foo

使用指向B的指针, ->foo()是不明确的。

如果编写B::foo方法(是否为虚拟方法无关紧要),则B->foo()调用它。


两件事共享一个名字的事实并不意味着它们是同一件事,也不意味着所有调用都是模棱两可的。

仅当您无法从上下文中命名哪个调用时,这些调用才是模棱两可的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM