问题描述
#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."