C++ 对象创建和绑定的奇怪结果

C++ 对象创建和绑定的奇怪结果,c++,this,dynamic-cast,C++,This,Dynamic Cast,我错误地写了一些愚蠢的东西,令我惊讶的是它居然奏效了 class A { public: void print() { std::cout << "You can't/won't see me !!!" << std::endl; } A* get_me_the_current_object() { return this;

我错误地写了一些愚蠢的东西,令我惊讶的是它居然奏效了

class A
{    public:
        void print()
        {
            std::cout << "You can't/won't see me !!!" << std::endl;
        }  
        A* get_me_the_current_object()
        {
            return this;
        }
};  
int main()
{
    A* abc = dynamic_cast<A*>(abc);
    abc->print();
}
此外,

A* abc = abc->get_me_the_current_object(); 
abc->print();
看到这些示例是如何工作的,以及映射是如何完成的,我大吃一惊。

有人能详细说明一下这些是如何工作的吗?提前感谢。

abc
未初始化,并指向内存中未定义的位置,但您的方法不会从
*此
读取任何内容,因此不会崩溃


他们不会崩溃的事实几乎可以肯定是实现定义的行为。

< P>你犯了一个普遍的错误,认为未定义的行为和C++错误意味着你应该看到一个戏剧性的崩溃或者计算机着火。有时候什么事也没发生。这并不意味着代码“有效”,因为它仍然有一个bug,只是症状没有出现然而

但是,它是有效的,所以我假设上面的陈述被破坏为:

A* abc;
abc = dynamic_cast<A*>(abc);
是的,您所做的只是将未初始化的指针转换为相同的类型,即不需要转换,因此编译器不做任何操作。指针仍然是相同的类型,并且仍然未初始化

这与此类似:

int i = i;
<>这是根据C++语法有效的,因为>I/COS>在这个范围内,但未定义,因为它复制了未初始化的对象。不过,这不太可能真的让你的电脑着火,因为它似乎“起作用”

有人能详细说明一下这些是如何工作的吗

从技术上讲,您取消引用的是无效指针,这是未定义的行为,但由于您的成员函数实际上不使用对象的任何成员,因此无效的
指针未取消引用,因此代码“起作用”(或至少看起来起作用)

这类似于:

void function(A* that)
{
    std::cout << "Hello, world!\n";
}
A* p;
function(p);
void函数(A*that)
{

库特反问:你为什么要这样做?这是未定义的行为
是虚拟的,然后调用它会试图取消引用
abc
,然后你几乎肯定会崩溃。@juanchopanza,
动态\u cast
不是UB,取消引用它来调用成员函数是UB。@JonathanWakely同意。我认为很多事情都很清楚……因此未定义的行为应该避免。它是未“定义实现”,因为这有一个非常具体的含义。如果它是由实现定义的,那么实现需要记录在这种情况下它们是否崩溃,但由于这是未定义的,它们可以做任何事情。您可能的意思是,它因实现而异,但它从未定义为具有特定的行为指针?您首先说它是未初始化的,不是空的。您声称有几件事是无效的:
int i=i;
无效(因为它涉及复制未初始化的
int
),在上一个示例中,调用
函数(p);
也是无效的(无论
函数
做什么),因为它涉及复制未初始化(无效)指针。这两个都是未定义的行为。@ JoaNehanWakely:正如你指出的,我犯了一个普遍的错误,认为未定义的行为和C++错误意味着你应该看到一个戏剧性的崩溃。谢谢你的美丽解释。
void function(A* that)
{
    std::cout << "Hello, world!\n";
}
A* p;
function(p);