c++ - c++ 类的方法中的虚拟是否会渗透到它的子级
问题描述
为什么在这个例子中会执行树底子类的方法呢?我认为虚拟只是意味着如果我通过类的指针执行方法,但实际上是指向子类的实例,它将执行子类的方法。但显然,如果任何父母将该方法定义为虚拟方法,它就会这样做。有人可以解释为什么会这样以及使用虚拟的最佳实践是什么?(我被教导将它放在所有重写基类虚拟方法的方法之前)这是代码:
#include <iostream>
class BaseClass
{
public:
virtual void myFunc()=0;
};
class Child1: public BaseClass
{
public:
void myFunc(){
std::cout << "Child1\n";
}
};
class Child2: public Child1
{
public:
void myFunc(){
std::cout << "Child2\n";
}
};
int main()
{
Child1 c1;
Child2 c2;
Child1 * p = &c1;
p->myFunc();
p = & c2;
p->myFunc();
return 0;
}
这将打印“Child1”和“Child2”而不是“Child1”两次,就像没有虚拟一样。我需要做什么才能获得具有预期结果的虚拟方法?
解决方案
这就是多态性的含义。
如果你有一个指向基类的指针(所谓的静态类型的指针),它被分配了一个指向派生类的指针(所谓的动态类型的指针),那么将在表中搜索虚函数实际指向的派生类中的虚函数指针。
在您的程序中,该类Child2
是该类的派生类Child1
class Child2: public Child1
{
//...
};
该类Child1
是该类的基类Child2
。该类覆盖其基类Child2
的虚函数。myFunc
Child1
推荐阅读
- laravel - 调用未定义的方法 Maatwebsite\Excel\Facades\Excel::download()
- jupyter-notebook - 获取当前 Jupyter 服务器 IPython 连接到的基本 URL
- javascript - 我想生成一个循环,该循环将在数组中的每个等级中“添加”加分,然后将新分数与给定的标准进行比较
- cocoa - Big Sur 统一工具栏——如何... NSWindow/NSToolbar
- multithreading - Selenium 使用多线程浏览器并行执行带来了前沿问题
- c# - 我无法调试 .NET Core 源代码
- azure - 通过 Azure 数据工厂处理 SSAS
- rust - 如何在 Rust 中内联 ASM 字节语句?
- react-native - flex 在 react-native 的 ScrollView 中不起作用
- string - 如何在python中找到两个不重叠的字符串