簡體   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