向下转换和虚函数
Downcasting and Virtual Functions
我在面试中被问到这个问题,我不确定在以下情况下的行为:
class A
{
virtual fun1(){...}
virtual fun2(){...}
};
class B : public A
{
virtual fun1(){...}
virtual fun2(){...}
};
如果
A* AObj = new A;
B* BObj = (B*) AObj;
由于虚拟关键字,BObj
是否可以访问B的方法?还是因为它指向AObj
的对象而不能访问B的方法?
有人能帮助我如何准确地下降影响访问也?
将基类对象的地址赋值给派生类指针是未定义行为。所以任何事情都可能发生:调用BObj
的函数可以调用B
的函数,可以调用A
的函数,可以使程序崩溃,甚至格式化您的硬盘。这取决于编译器和它的优化选项。
首先,做这个
A* AObj = new AObj();
B* BObj = AObj;
根本不安全,因为它将基类对象(Parent)的地址分配给派生类(Child)指针。因此,代码期望基类对象具有派生类属性。
但是你可以这样做:
A* AObj = new AObj();
B* BObj = dynamic_cast<B*>AObj;
这将检查Aobj是否可以分配给Bobj。如果可以,返回对象的地址,否则返回0。
你可以这样写:
B* BObj = dynamic_cast<B*>AObj;
if(BObj)
{
//Now you can use it safely.
}
在这种情况下(多态性),指针的类型(BObj,这里它的类型不是B)是它所指向的对象的类型(A)。所以BObj是基类的对象,并且不能做派生类(B)中定义的额外工作(函数)。
相关文章:
- 如何使用Rcpp将R函数转换为C++函数
- C++函数转换为 C# 函数
- 将 C 函数转换为 C++ 以检查数字是否有效
- C++:从重载函数转换为 std::function
- 将 C 函数转换为C++语言
- C++隐式构造函数转换,后跟类型向上转换
- 将 lambda 函数转换为具有混合 lambda 引入器和参数列表的函子结构
- 通过 Boost Python 将 Python 函数转换为 C++,用作回调
- 如何将 MATLAB 图像处理库内置函数转换为 MATLAB 编码器代码生成不支持的 C++?
- 如何将函数转换为 lambda 函数
- 自定义函数转换错误?
- 将 C# 哈希函数转换为C++
- 将 lambda 函数转换为另一个编译单元中的普通函数会缩短编译时间吗?
- 加快 R 性能或将 R 函数转换为C++函数
- 将成员函数转换为指向成员函数的指针
- 将MATLAB炒作函数转换为C
- Rcpp - 用二进制函数转换数字向量?
- C lambda函数转换误差
- 此语法中的构造函数转换错误
- 将函数转换为find_if lambda