C++动态绑定问题

发布于 2024-10-14 02:24:15 字数 456 浏览 0 评论 0原文

问题是:
a) 下面的代码合法吗? (考虑到它在运行时崩溃)
b) 如果 gcc 或 MVC 在编译时显示任何编译器标志,则以下代码中存在潜在问题?

#include <iostream>
using namespace std;
class A
{
public:
    void write(){   cout<<"A"; }    
};
class B
{
public:
    virtual void write(){ cout<<"B"; }  
};
int main()
{

    A *pa=(A*) new B();
    pa->write();
    B *pb=(B*) new A() ;
    pb->write();

    delete pa;
    delete pb;
    return 0;
}

谢谢!

The questions are:
a) Is the following code legal or not ? (considering it crashes at run-time)
b) If there is any compiler flag for gcc or MVC to show at compile time, a potential problem in the following code ?

#include <iostream>
using namespace std;
class A
{
public:
    void write(){   cout<<"A"; }    
};
class B
{
public:
    virtual void write(){ cout<<"B"; }  
};
int main()
{

    A *pa=(A*) new B();
    pa->write();
    B *pb=(B*) new A() ;
    pb->write();

    delete pa;
    delete pb;
    return 0;
}

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

野侃 2024-10-21 02:24:15

不,这是不合法的。 B 不是从 A 派生的,反之亦然。像这样强制强制转换会导致未定义的行为。你告诉编译器“闭嘴,我知道我在做什么”,这会导致各种各样的麻烦。这是避免旧的 C 风格转换并使用 C++ 风格转换(static_cast 等)的原因之一。

No, it's not legal. B doesn't derive from A, nor vice versa. Forcing a cast like this results in undefined behaviour. You're telling the compiler "shut up, I know what I'm doing", which leads to all sorts of trouble. This is one reason to avoid old C-style casts, and use C++-style casts instead (static_cast, etc.).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文