关于隐藏,覆盖和虚拟表的汇编错误
compilation error regarding name hiding ,override and virtual table
我在玩C 规则。我碰到了一个错误,但我无法解释。请帮助解释为什么汇编错误发生。顺便说一句,我对解决问题并不有趣。谢谢
Q1为什么藏身名称不起作用?例如,如果我们删除Linea的关键字Virtual。汇编将有效
Q2在case2中添加函数后,汇编将通过。
请帮助解释Q1和Q2。
#include
using namespace std;
class base
{
public:
virtual int func() // lineA
{
cout << "vfunc in base classn";
return 0;
}
};
class derived: public base
{
public:
double func()
{
cout << "vfunc in derived classn";
return 0;
}
};
int main()
{
return 0;
}
输出:
main.cpp:18:14: error: conflicting return type specified for 'virtual double derived::func()'
double func()
^
main.cpp:8:19: error: overriding 'virtual int base::func()'
virtual int func()
案例2:
#include <iostream>
using namespace std;
class base
{
public:
virtual int func()
{
cout << "vfunc in base classn";
return 0;
}
// new added
virtual double func(int)
{
return 0.0;
}
};
class derived: public base
{
public:
double func(int)
{
cout << "vfunc in derived classn";
return 0;
}
};
int main()
{
return 0;
} ^
当您覆盖功能时,每当原始的实现都必须可调用。base
功能在这里返回int
。这意味着任何呼叫者都会期望int
。
发生错误是因为您的覆盖功能是返回double
而不是int
。
以及编译器错误指出您已定义了func()的不同返回类型。您可能会认为这应该通过C 过载来掌握,但是过载只能在不在返回值上的输入参数上完成。例如:
class base
{
public:
virtual int func(int param)
{
cout << "vfunc in base classn";
return 0;
}
};
class derived: public base
{
public:
double func(double param)
{
cout << "vfunc in derived classn";
return 0;
}
};
在此代码中,源是派生中的重载,因为它具有输入参数的另一种类型。
相关文章:
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 纯虚拟类和错误未定义对 'vtable 的引用
- 派生类调用父类的方法,该方法调用重写的虚拟方法调用错误的方法
- 为什么调用没有正文的纯虚拟方法不会导致链接器错误?
- AWS pandas 安装出现错误:虚拟内存已耗尽:无法分配内存
- 错误消息:不允许抽象类类型 "X" 的对象:纯虚拟"Y"没有覆盖器
- 为什么覆盖非虚拟函数不会导致编译错误
- 与lambda一起使用虚拟继承在初始化列表中捕获此问题的GCC错误
- SQLITE错误:无法重置虚拟机
- 谷神星求解器成本函数继承错误:模板可能不是虚拟的
- C++ 类型特征虚拟示例:编译器错误
- 带有虚拟函数的链接器错误C
- 在模板类中覆盖虚拟函数的错误
- CMake 构建错误 - 虚拟方法错误缺少 vtable
- 排除外部错误R6025-纯虚拟函数调用
- 实现纯虚拟方法后,VTable C 错误
- 当试图检测基类是否具有虚拟破坏者时,如何获取正确的编译器错误消息
- "vtable"链接器错误(涉及带有"=default"的虚拟析构函数) - Clang 3.1 中的潜在错误?
- c++链接错误2019无法解决的外部符号虚拟错误,因为接口…(?)