【发布时间】:2015-09-06 22:40:52
【问题描述】:
我希望标题不会令人困惑。我试图理解以下由在 C++ 中定义类的虚拟或非虚拟方法引起的问题。想象一下,我有一个基类 A 和一个派生类 B,这样
class A {
public:
void print() { cout << "A"; }
}
class B : A {
public:
void print() { cout << "B"; }
}
如果我知道执行下面的代码,打印命令会打印出“A”。
A *a = new A();
B *b = new B();
((A *)b)->print(); // this prints "A"
但是,如果我将两个类中的“打印”方法声明为虚拟方法,我会在屏幕上看到打印的“B”。为什么会发生这种情况?
【问题讨论】:
-
您能否澄清“为什么会发生这种情况?”这个问题?您是否要求在标准中提供指定语言的参考,或者您是否要求例如“什么是 vtable,它在典型实现中是如何工作的”
-
@ChrisBeck 我知道问题的答案是,如果方法不是虚拟的,那么调用的方法“取决于编译时使用的类型”,而如果方法是定义为虚拟的,那么“对象的运行时类型”确定调用哪个定义。那是我不完全明白的。
-
会发生什么是旧样式转换用于访问私有基类;隐式转换不起作用,
static_cast不行,reinterpret_cast可能在实践中起作用,但会给 UB。
标签: c++ runtime virtual-functions compile-time