多重继承相同的方法名,没有歧义
Multiple inheritance same method name and no ambiguity
我有两个类(A0和A1(有一个函数foo((,一个A0有一个只调用foo((的函数bar((。以及从 A0 和 A1 继承的 B 类。
B 除了从 A0 和 A1 继承之外什么都不做。
为什么打电话给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()
。
如果不覆盖B
中的foo
,则两个foo
将保留在 vtable 中,除了名称外不相关。
在A0::bar
中,当你调用foo()
时,它会在本地查找foo
。 它看到一个 -A0::foo
- 这是虚拟的。 因此,它将调用编码到 vtable 中以执行A0::foo
。
如果没有B
中的覆盖,调用A0::foo
。 在B
中使用覆盖时,这将调用B::foo
然后调用A1::foo
。
如果你没有virtual
,好吧,除了vtable
位之外,同样成立。
您有两个函数A0::foo
和A1::foo
。 使用指向A0
的指针,->foo()
调用A0::foo
。
使用指向B
的指针,->foo()
是模棱两可的。
如果您编写一个B::foo
方法(无论它是否是虚拟的(都无关紧要,那么B->foo()
调用它。
两个事物共享一个名称的事实并不意味着它们是同一事物,也不会使所有调用都模棱两可。
仅当您无法从上下文中分辨出要命名的调用时,调用才不明确。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 解决虚拟方法的歧义继承的两种方法
- 解决歧义的方法
- 减少模板化变差函数歧义的最佳方法是什么
- 解决此模板分辨率歧义的正确方法是什么?
- C++方法调用和类型范围解析的歧义
- 采用可选且无参数的重载方法:为什么没有歧义
- 这是解决函数调用歧义的正确方法吗?
- 绕过依赖于参数的查找歧义的非侵入性方法