c++ - 不同的功能?
问题描述
所以这里是代码示例。任务是提供此代码将打印出来的输出。是2个不同的功能吗?那么 B 类中的 vtable 会发生什么?它是否仅在 2 个同名的不同函数上存储 2 个指针?
#include<iostream>
#include <vector>
using namespace std;
class A
{
public:
A()
{
init();
}
virtual void init(bool a = true)
{
if(a)
cout << "A" << endl;
}
};
class B :public A
{
public:
virtual void init()
{
cout << "B" << endl;
}
};
int main()
{
B b;
A* a = &b;
a->init();
a->init(true);
system("pause");
}
真的找不到在哪里阅读有关此案的信息。如果你看过这个案例,你能解释一下或给出一些来源的链接吗?
解决方案
它们已经是两个不同的函数(覆盖不会改变这一点),但是因为它们具有不同的签名,所以 in 中的一个不会B
覆盖in中的那个。A
请记住,函数的名称只是其身份的一部分!它的参数列表也很重要。
如果您将override
关键字放在上面,B::init()
那么您的程序将无法编译,因为B::init()
实际上并没有覆盖任何东西(在它的基础中没有init()
, virtual 或其他)。
A::init(bool)
如果这两个函数实际上具有不同的名称,例如and ,那么 vtable 就不会真正“发生”任何事情B::urgleburgleboop()
。
请注意,除了virtual
多态性和覆盖之外,B::init()
还“隐藏”A::init(bool)
了正常的重载解决方案(感谢 C++!),因此 Clang 会警告您的代码。
至于你可以在哪里阅读它,你的 C++ 书将是一个好的开始。:)
推荐阅读
- node.js - 设备到设备推送通知firebase - onWrite问题
- php - php将相同的值分成字符串中的一个组
- swift - UICollectionView 单元格按钮长按手势返回自我不断变化?
- android - 生成发布 APK 时出错。错误:重复资源;AAPT:错误:找不到资源字符串/app_name
- node.js - 如何在 AWS Lambda 中使用 Nodejs“请求”工作?
- jpa - EclipseLink 延迟属性抛出 ConcurrencyException
- scala - Scala Spark collect_list() 与 array()
- javascript - Dash 中的多页应用程序 - 其他页面中无法识别的下拉值
- javascript - 如何有效地查询索引处的元素
- python - 这个 beautifulsoup 脚本可以用正则表达式简化吗?