指向基类对象的派生类的指针如何访问两个类的函数?

    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*) &a

这是一个 C 风格的演员表。不要使用 C 风格的强制转换。它在不同的上下文中可能意味着不同的事情。在这种情况下,它意味着从基类指针到派生类指针的静态转换。

当您静态转换为不是对象的动态类型(或动态类型的基础)的派生类型时,程序的行为是未定义的。不要向下转换为不是对象的动态类型(或基类)的类型

如果您不知道动态类型是什么1,那么这dynamic_cast是一个更安全的选择,因为您可以检查 null 以防您的猜测错误。也就是说,如果您需要在不知道派生类型的情况下进行向下转换,那么您的设计可能很糟糕,您可能应该编写一个虚函数。

另一个经验法则:如果您不知道自己在做什么,那么添加演员表会给您带来问题。在随机使用它之前研究一下铸造意味着什么。

1这是关于可能在何处使用向下转换的假设性讨论。在这种情况下,您应该知道动态类型不是您要强制转换的类型,因此对该类型的任何强制转换都是毫无意义的。


以上是指向基类对象的派生类的指针如何访问两个类的函数?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>