指向基类对象的派生类的指针如何访问这两个类的函数
How can a pointer to a derived class pointing to the object of base class can access function of both class?
class A {
public:
int a = 5;
int geta(){return a;}
};
class B : public A {
public:
int b = 6;
int getb(){return b;}
};
int main(){
A a;
B* b = (B*) &a;
cout<<b->geta()<<endl;
cout<<b->getb();
}
输出:5
5
问题:为什么两者给出相同的结果
铸造内部如何运作?
当前我正在使用:线程型号:win32
gcc 9.2.0版(gcc(
为什么两者给出相同的结果?
因为程序的行为是未定义的。
铸造内部是如何工作的?
这个演员阵容不会"工作";。程序的行为是未定义的。
一些额外的解释。
(B*(&
这是一个C风格的转换不要使用C风格的强制转换。在不同的语境中,它可能意味着不同的东西。在这种情况下,它意味着从基类指针到派生类指针的静态转换。
当静态转换为不是对象的动态类型(或动态类型的基(的派生类型时,程序的行为是未定义的不要向下转换到不是对象的动态类型(或基(的类型。
如果您不知道动态类型是什么1,那么dynamic_cast
是一个更安全的选项,因为如果您的猜测是错误的,您可以检查null。也就是说,如果你需要在不知道派生类型的情况下进行下转换,那么你的设计可能很糟糕,你可能应该编写一个虚拟函数。
另一条经验法则是:如果你不知道自己在做什么,那么添加选角会给你带来问题。在随机使用铸造之前,先研究铸造的含义。
1这是一个关于在哪里可以使用下变频的假设性讨论。在这种情况下,您应该知道动态类型不是您要转换的类型,因此任何转换为该类型的操作都是毫无意义的。
回答问题How does casting works internally ?
,因为它似乎被另一个答案遗漏了。
在内部,使用static_cast
处理c型铸件。只有当要指向(或引用(的对象的动态类型与强制转换匹配时,才允许层次结构下的static_cast
。在您的情况下,它不是-对象的动态类型仍然是A
。
但是static_cast
并没有真正检查动态对象类型(这是因为它被称为静态(,它允许程序员基本上说:";相信我,我知道我在做什么;。所以编译器强制并相信您,并生成在假设动态类型是您所说的类型的情况下可以正确工作的代码
不过,在您的情况下,它并不是这样编译的程序会意外地运行。
- 如何在函数外部访问函数中局部变量的值?
- UChildActorComponent的ChildActorClass中的访问函数
- 访问函数变体时"Invalid conversion"错误
- 在将向量作为参数传递给函数后,我无法访问函数中向量的元素
- 在64位DLL中访问函数的错误
- 访问函数中 const char *arr[] 的元素
- 访问函数的调用方类型
- 访问函数中的使用声明:与范围相关的问题
- 通过 -> 语法 c++ 从指针访问函数
- 在函数中使用 const 引用参数访问函数中成员的最佳实践 C++.
- 从另一个文件(C++,QT)访问函数未解析的外部
- 如何从主(C )访问函数中的值
- 访问函数 c++ 中的全局变量
- C++ GoogleTest 使用夹具 - 无法访问函数指针定义
- 在不知道名称的情况下访问函数参数
- C++:直接访问器或类内的访问函数
- 无法从对象访问函数
- 类的2D矢量在访问函数时出错
- 为什么在C++中访问函数时没有对象
- 我无法使用指针数组从main访问函数(在类中)