具有继承的未初始化指针对象

Uninitialized pointer object with inheritance

本文关键字:初始化 指针 对象 继承      更新时间:2023-10-16

我正在使用一个未初始化的指针对象来访问成员函数。它是有效的,我知道它是如何工作的。但是,当我用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;
}

取消引用未初始化的指针是未定义的行为。为什么你认为它不应该崩溃?

第一次对未初始化的指针或空指针使用解引用运算符(->)时,您的代码很可能会产生分段错误。这是未定义的行为。这意味着,如果它对你有效,那只是运气,或者更确切地说是坏运气,因为编译器在寻找错误时误导了你。

使用这样的指针:

A *ptr = new A();
ptr->printml(1);

当您调用函数时,会发生以下事情1) 编译器检查对象的类型(而不是内容)并调用该类型的成员函数。2) 它将此指针(指向对象本身的指针)作为第一个参数传递给成员函数3) 它隐式地使用该指针来调用成员变量。

考虑到以上几点,在您的情况下,当您不在成员函数中使用成员变量时,该指针不会被使用,这就是为什么它不会崩溃,而当您使用成员变量后,它会崩溃。

尽管如此,这仍然被认为是未定义的行为,在没有初始化指针对象的情况下,不能使用指针对象