我对C ++中的多级继承和虚函数有些困惑。在下面的示例中,我具有3个Bottom继承级别,分别是从Middle继承自Top。
如果我在Topas中声明该函数virtual并使用type指针Middle,则Middle即使未声明该函数,它仍然会覆盖声明的函数virtual。
我期待:
Middle* ptr = new Bottom();
ptr->hello(); // Expectation: "Hello Middle" (Actual: "Hello Bottom")
Run Code Online (Sandbox Code Playgroud)
和
Top* ptr = new Bottom();
ptr->hello(); // "Hello Bottom"
Run Code Online (Sandbox Code Playgroud)
但这似乎并非如此。为什么是这样?
完整代码:
#include <iostream>
// Top
// ^
// Middle
// ^
// Bottom
struct Top {
// This is set to virtual.
virtual void hello() { std::cout << "Hello Top\n"; }
};
struct Middle : public Top {
// But not this.
void hello() { std::cout << "Hello Middle\n"; }
};
struct Bottom : public Middle {
// So why is this called if the type is Middle?
void hello() { std::cout << "Hello Bottom\n"; }
};
int main() {
Middle *ptr = new Bottom(); // Will use hello() in Bottom.
// Top *ptr = new Bottom(); // Same result as the above.
ptr->hello();
delete ptr;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果基本函数是虚拟的,则无论您是否将它们指定为虚拟,派生函数都是虚拟的:
如果某个成员函数vf在Base类中声明为虚函数,而某些Derived类(直接或间接地从Base派生)对成员函数声明了相同的
名称参数类型列表(而不是返回类型)cv-qualifiers ref-qualifiers然后,Derived类中的此函数也是虚拟的 (无论是否在其声明中使用了关键字virtual)并覆盖Base :: vf(是否声明中使用了override一词)。
如果要访问基本功能,可以使用:
ptr->Top::hello();
Middle* ptr2 = new Bottom();
ptr2->Middle::hello();
delete ptr;
delete ptr2;
Run Code Online (Sandbox Code Playgroud)
活在当下
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |