当中间类跳过实现时,在继承层次结构中执行哪种虚拟方法
Which virtual method is executed in an inheritance hierarchy when intermediate classes skip the implementation?
我敢肯定有人以前问了这个问题,但我根本不知道该搜索什么。因此,一旦有人将我指向一个类似问题,我很高兴立即删除这个问题。如果有人有更好的建议,我也很乐意重命名问题: - (
我想知道以下代码是否由标准定义了行为,或者这可能是编译器/平台依赖性的:
struct A
{
virtual void f()
{
std::cout << "A::f()" << std::endl;
}
};
struct B : public A
{
// f() is not implemented here
};
struct C : public B
{
virtual void f() override
{
B::f(); // call f() of direct base class although it is not implemented there
std::cout << "C::f()" << std::endl;
}
};
int main()
{
A* pA = new C();
pA->f();
}
Visual Studio 2017和GCC 5.4.0的输出是:
A::f()
C::f()
编译器确实会在层次结构中向上搜索直到找到实现?您可以链接到C 标准吗?我已经通过在纯虚拟的情况下制作f((来对其进行测试,并且链接器很好地告诉我,有一个未解决的符号。我可以依靠吗?
我理解使用示波器操作员,例如b :: f((总是调用非虚拟版本。因此,从未发生过多态性,是吗?
edit :误导性的打印语句,用" c :: f(("替换为" b :: f(("。
指针的动态类型
A* pA = new C();
是C *
。
因此,C类中的虚拟函数称为
struct C : public B
{
virtual void f() override
{
B::f(); // call f() of direct base class although it is not implemented there
std::cout << "B::f()" << std::endl;
}
};
B类并未重新定义基类A的虚拟功能。因此,在此语句中
B::f(); // call f() of direct base class although it is not implemented there
a类中定义的虚拟函数称为。那是B类虚拟函数的指针表,其中包含a。
中定义的函数在此呼叫中
B::f();
可以访问B类虚拟函数表,并且该表包含a类函数定义的地址,因为该函数在b。
类中并未超过。来自C 标准(5.2.2功能调用(
- ...如果所选函数是非虚拟的,或者类成员访问表达式中的ID-Exprivese是合格的ID,则该功能 叫做。否则,其最终的Overrider(10.3(在动态类型中 对象表达式称为;这样的电话称为 虚拟功能调用。[
相关文章:
- 如何重构类层次结构以避免菱形问题
- C++ 中模板化类型的类层次结构
- 为什么不同类型层次结构的指针之间的dynamic_cast定义得很好?
- 继承层次结构并将元素添加到向量
- C++ 类层次结构中的"对齐"是什么意思?
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 类层次结构中的运算符重载
- 如何在层次结构中实现运算符使用?
- 反向层次结构中的可变参数模板参数
- 如何在继承层次结构中调用具有默认参数的构造函数?
- C++ 提升 - 包含类层次结构对象的类的序列化
- 在C++继承层次结构时提取实现者
- 在C++中将类实例添加到对象层次结构中的问题
- 确定大层次结构中基本指针的实际类型,无需dynamic_cast
- 在继承层次结构中复制和移动
- 模板冲突的类型-但类型应该是相同的cfr类层次结构
- 删除父/子窗口层次结构的最佳方法
- 当中间类跳过实现时,在继承层次结构中执行哪种虚拟方法
- 如何对多态继承层次结构执行灵活的序列化
- 继承层次结构:构造函数和析构函数执行顺序