gpt4 book ai didi

c++ - 派生类调用基类对象的方法

转载 作者:太空狗 更新时间:2023-10-29 12:38:11 25 4
gpt4 key购买 nike

我写了几行我认为不应该编译的代码。我在指向基类对象的 static_cast-ed 指针上调用派生类的方法,如下所示:

class B {};    

class D: public B
{
public:
void bar() { printf("%d\n", m_i); }
private:
int m_i;
};

int main()
{
B b;
D* d = static_cast<D*>(&b);
d->bar();
return 0;
}

打印的值显然是垃圾,但它是否应该编译? gcc 如何做到这一点?

最佳答案

gcc 不能保证它是不正确的,除非在少数情况下确实不值得检查。当您使用 static_cast 时,您就是在向编译器保证您知道自己在做什么。

这里有两种类型的转换。 static_cast,也就是说,您告诉编译器指向基的指针是指向派生的指针,闭嘴并继续处理它。 dynamic_cast,也就是说,您要求编译器检查指向 base 的指针是否确实是指向 derived 的指针。您使用了 static_cast,因此编译器关闭并按照您说的去做。

编辑:John 准确地指出,在您的继承层次结构中没有虚函数,为此您应该从 C++ 中解雇,并且 dynamic_cast 仅对虚函数有效。

关于c++ - 派生类调用基类对象的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4607615/

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