gpt4 book ai didi

c++ - 当强制类型转换为完全不同的类时,static_cast的行为如何?

转载 作者:行者123 更新时间:2023-12-02 10:13:21 24 4
gpt4 key购买 nike

我在学习c++的继承和虚拟方法方面做一些练习。
所以我发现我自己:

class A{
public:
virtual void f() const {cout << "A::f";}
virtual void g() {cout << "A::g"; m();}
virtual void h() {cout << "A::h"; f();}
void m() {cout << "A::m"; f();}
virtual A* n() { cout << "A::n"; return this;}
}

class B : public A{
public:
virtual void f() const {cout << "B::f";} //override
void g() {cout << "B::g"; A::n();} //override
virtual void m() {cout << "B::m"; f();}
A* n() { cout << "B::n"; return this;}
}

class C : public A{
public:
virtual void f() {cout << "C::f";} //new method cause misses const
void g() const {cout << "C::g"; m();} //new method cause added const
void m() {cout << "C::m"; g(); f();}
}



***
A*q3 = new C();
(static_cast<B*>(q3->n()))->f(); //solution is A::n A::f
***
那么,这是本书中的错误吗?对我来说,据我所知,我将其标记为“未定义的行为”,但是如果我错了,这是如何工作的?

最佳答案

这将C*对象转换为A*对象(通过n()),然后将A*对象转换为B*对象。最后,它调用虚拟函数。
那么在实践中会发生什么呢?编译器将查找基础对象的虚拟表,并在其中找到要调用的函数f。虚拟表是内存中的实际表。因此,从A到B再到C的所有转换都不会影响表中的数据。
没有未定义的行为,确实会调用A::f
但是,这仅适用于虚拟函数。如果代码使用C对象调用B的成员函数,并且该函数要利用B中可用的成员数据而不是C中的成员数据,那么所有的事情都会变得一团糟。欢迎使用C++,在这里,脚掌射击是您所需要的功能。

关于c++ - 当强制类型转换为完全不同的类时,static_cast的行为如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62739338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com