c++ - 基类的继承和指针

标签 c++ inheritance ambiguity

我正在经历这个Book我无法解决这个问题:

如果 B::f(int) 隐藏了 A::f(),为什么 pa1->f(); 没有报错?

名称隐藏是否意味着 f() 函数不存在于 class B 中?如果 pa1 指向 class B 的对象,那么 pa1->f(); 应该会导致错误,就像 b.f () 确实如此!

请解释一下,因为我无法通过书来理解它! 提前致谢!

#include <iostream>
using namespace std;

struct A {
   virtual void f() { cout << "Class A" << endl; }
};

struct B: A {
   void f(int) { cout << "Class B" << endl; }
};

struct C: B {
   void f() { cout << "Class C" << endl; }
};

int main() {
   B b; C c;
   A* pa1 = &b;
   A* pa2 = &c;
//   b.f();
   pa1->f();
   pa2->f();
}

最佳答案

如果您试图从 B 的范围内调用 f() 将会出错。但是,您是通过指向基类的指针来调用它的。名称查找和重载解析是根据对象的静态类型完成的,在本例中为 A*。从那里,f() 是可见的。

关于c++ - 基类的继承和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18849578/

相关文章:

c++ - 转发声明使用 enable_if : ambiguous call 的函数

c++ - 编译器没有发现歧义

c++ - 为什么这是 gcc 中的 "overloading ambiguity"?

c++ - 如何检查套接字在一段时间内没有接收

c# - 如果一个结构不能继承另一个类或结构,为什么 Int32 有 ToString() 方法?

c++ - 求二叉搜索树的中位数,C++

Java 从父类(super class)字段继承

javascript - 子类可以覆盖从父类(super class)继承的私有(private)字段吗?

c++ - 使用 C++ 的 SFML 平台游戏

c++ - 在两层迭代器中重载 C++ 会产生奇怪的错误