[英]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.