没有对象实例化的调用成员函数的行为不确定吗?

问题描述

我有以下代码

#include <iostream>
#include <string>

class BaseNode {
    public:
        BaseNode(std::string s) {
            std::cout << "Called BaseNode(string)" << std::endl;
        }
        BaseNode() {
            std::cout << "Called BaseNode()" << std::endl;
        }

        void count(int num) {
            std::cout << "count() in BaseNode " << num << std::endl;
        }

};

class MyNode : public BaseNode {
    public:
        MyNode() : BaseNode("test") {
            std::cout << "Called MyNode()" << std::endl;
        }

        void count(int num) {
            std::cout << "count() in MyNode " << num << std::endl;
        }

};

int main(int argc,char * argv[]) {
    MyNode *mn;
    mn->count(6);
    return 0;
}

令我惊讶的是,它在MyNode 6中编译并打印了“ count()”。但是应该有效吗?

如果我在基类中声明count为虚拟

class BaseNode {
    public:
        BaseNode(std::string s) {
            std::cout << "Called BaseNode(string)" << std::endl;
        }
        BaseNode() {
            std::cout << "Called BaseNode()" << std::endl;
        }

        virtual void count(int num) {
            std::cout << "count() in BaseNode " << num << std::endl;
        }

};

计数电话中出现“细分错误”。这里的幕后情况是什么?

解决方法

MyNode *mn;创建一个Wild Pointer或一个悬空指针,即一个指向您不拥有的内存的指针。因此,尝试取消对指针的引用并获取该内存确实是未定义行为。

这里的幕后发生了什么?

由于这是未定义行为,所以我们不知道。这里的结果取决于编译器决定执行的操作,其中很可能包括making "demons fly out of your nose."

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...