基类的继承和指针
Inheritance and Pointers of Base Class
我正在阅读这本书,我无法理解这一点:
如果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()
可见。
如果
B::f(int)
隐藏A::f()
,为什么pa1->f();
不给出错误?
因为pa1
指向A
,而A
有一个叫做f
的成员,可以这样称呼。在这种情况下,任何其他类(包括B
)都是无关紧要的。
名称隐藏不是意味着,
f()
函数B
中不存在吗?
不。这意味着,在B
的上下文中,唯一可以通过非限定查找找到的称为f
的函数是B::f
。它不会从任何其他上下文中删除f
,也不会阻止合格的查找(如 b.A::f()
)找到它。
如果
pa1
指向类B
的对象,那么pa1->f();
应该像b.f()
一样导致错误!
动态类型是 B
,因此这是用于调用虚函数的类型(在运行时)。非虚函数由编译器根据静态类型选择,即A
。通常,编译器不知道动态类型;它只知道指针指向一个A
或某个未知的派生类。
调用 pa1->f(); 首先路由到类型 A 的对象,因为 pa1 是指向该类型的指针。如果存在与调用的确切 (!!) 签名匹配的函数,则 virtual 关键字会将调用重新路由到类型 B。由于类型 B 中没有这样的函数,因此执行类型 A 函数。
我的意思是,在这种情况下,函数不会因为签名不同而相互"隐藏"。[f(无效) vs. f(int)]
编辑:更清楚一点。f(int) 和 f(void) 是两个完全不同的函数。与 f(void) 到 g(int) 一样不同。
- 关于C++中具有多重继承"this"指针的说明
- 共享指针继承,而不先显式强制转换
- 派生类是从基类继承 v 指针并仅使用它,还是也有自己的 v 指针?
- 使用智能指针附加的继承对象的深层复制
- 嵌套类、继承和C++中的共享指针
- 删除C++中的继承类指针数组
- 具有虚拟指针和继承的 CPP 类大小
- 钻石继承虚拟成员铸造与指针
- 当键是虚拟继承中涉及的基类指针时,对 std::unordered_map 项的访问崩溃
- 当依赖关系和依赖关系都是多态时,在哪个继承级别存储依赖关系指针?
- cppyy 继承包含智能指针的类
- 作为模板参数的成员函数指针在继承的成员函数上失败,如何以及为什么?
- 是否可以将成员作为指针继承
- C++14 不能调用从唯一指针继承的类的复制构造函数或运算符 =
- 是无限的Typedef函数指针继承
- 是否可以从 C++11 智能指针继承并覆盖相关运算符?
- 继承:使用从父指针继承的方法
- 使用智能指针继承的皮条
- 是覆盖返回类型所需的指针-继承
- 调用未从BaseClass指针继承的DerivedClass函数