我正在使用未初始化的指针对象来访问成员函数。它有效,我知道它是如何工作的。但是当我用B派生该类并尝试访问该成员函数时,它会给出分段错误。有人可以解释为什么它表现出两种不同的行为吗?
以下是该计划: 如果我对第29行进行评论,它可以正常工作,但如果没有,它就会失败。
#include <iostream>
using namespace std;
class A
{
int no;
public:
void printml(int i)
{
no = i;
cout << "in base: value"<<no;
}
};
class B:public A
{
public:
void printdl()
{
cout << "in derived" ;
}
};
int main()
{
A *ptr;
B *ptr1;
ptr->printml(1);
ptr1->printml(1);
return 0;
}
答案 0 :(得分:4)
取消引用未初始化的指针是未定义的行为。为什么你认为它不应该崩溃?
答案 1 :(得分:0)
第一次在未初始化的指针或空指针上使用解除引用运算符(->
)时,您的代码很可能会产生分段错误。这是未定义的行为。这意味着如果它对你有用,那只是运气,或者说运气不好,因为编译器在寻找错误时会误导你。
使用这样的指针:
A *ptr = new A();
ptr->printml(1);
答案 2 :(得分:0)
当您调用函数后,事情发生了 1)编译器检查对象类型(不是内容)并调用该类型的成员函数。 2)它将此指针(指向对象本身的指针)作为第一个参数传递给成员函数 3)它隐式使用这个指针来调用成员变量。
考虑到以上几点,在你的情况下,当你没有在成员函数中使用成员变量时,不使用这个指针,这就是为什么它不会崩溃,当你使用成员变量时它会崩溃。
仍然将此视为未定义的行为,并且必须在不初始化的情况下使用指针对象。