- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我确定之前有人问过这个问题,但我只是不知道要搜索什么。因此,一旦有人向我指出类似问题,我很乐意删除此问题。如果有人有更好的建议,我也很乐意重命名问题:-)
我想知道以下代码是否是标准定义的行为,或者这是否可能依赖于编译器/平台:
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++ 标准吗?我已经通过在 A pure virtual 中制作 f() 来测试它,链接器很好地告诉我有一个未解析的符号。我可以依靠它吗?
据我所知,使用像 B::f() 这样的范围运算符总是调用非虚拟版本。所以从来没有发生过多态性,是吗?
编辑:误导性的打印语句将“B::f()”替换为“C::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 函数调用)
- ...If the selected function is non-virtual, or if the id-expression in the class member access expression is a qualified-id, that function is called. Otherwise, its final overrider (10.3) in the dynamic type of the object expression is called; such a call is referred to as a virtual function call. [
关于c++ - 当中间类跳过实现时,在继承层次结构中执行哪个虚方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49672744/
我有一个特别的问题想要解决,我不确定是否可行,因为我找不到任何信息或正在完成的示例。基本上,我有: class ParentObject {}; class DerivedObject : publi
在我们的项目中,我们配置了虚 URL,以便用户可以在地址栏中输入虚 URL,这会将他们重定向到原始 URL。 例如: 如果用户输入'http://www.abc.com/partner ',它会将它们
我是一名优秀的程序员,十分优秀!