c++ - 为什么不能不创建实例就不能使用多态类

标签 c++ oop polymorphism

<分区>

Possible Duplicate:
Calling class method through NULL class pointer

我在面试中被问到这个问题,有人能回答吗?

#include<string>
#include<iostream>
#include <stdio.h>

using namespace std;

class A
{
int k;
public:
     void f1()
    {

     int i;
     printf("1");

    }

     void f2()
    {

     k = 3;
     printf("3");

    }

};
class B
{
int i;
public:
    virtual void f1()
    {
    printf("2");
    scanf("%d",&i);
    }

};


int main()
{
    A* a = NULL;
    B* b = NULL;

    a->f1(); // works why?(non polymorphic)
    b->f1(); // fails why?(polymorphic)
            a->f2(); //fails why?
}

后两种情况属于多态类。第一种情况是普通类。我知道如果我在 A 的 f1 中访问 i 它将再次给出运行时异常。但我不明白为什么会这样

最佳答案

我同意其他帖子认为这是未定义的行为,这意味着在执行程序时可能发生任何事情,包括“做正确的事”。

现在,让我们看看这些调用是如何实现的:

a->f1() 是一个普通的方法调用(非虚拟)。大多数编译器将以与以下代码类似的方式编译它:

    class A { int i; }
    void f1(A* a) { int i; printf("1"); }

意思是 this 指针实际上被当作函数的参数来处理(在实践中,经常有一些关于如何处理 this 指针的优化,但这与这里无关)。现在,由于 f1 不使用 this 指针,因此它为 null 的事实不会导致崩溃。

a->f2() 实际上会崩溃,因为它使用了 this 指针:它更新了 this->k

b->f1() 的调用是一个虚函数调用,这通常是使用虚表查找作为 b->vtable[0]()。由于 b 为 null,因此读取虚拟表的取消引用崩溃。

关于c++ - 为什么不能不创建实例就不能使用多态类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12784135/

相关文章:

C++ 多态打印

c++ - 从派生指针调用虚函数而不支付 vtable 价格

c++ - 如何找到子字符串的位置并从那里打印它

c++ - googletest & cmake - 体系结构 x86_64 的 undefined symbol

c++ - GCC:在 "control reaches end of non-void function"中断编译

c++ - 多类依赖

c# - 强制方法从基类调用基方法

c# - 多态性,调用正确的函数

oop - 游戏架构: Class leaking into almost all files

c++ - 使用数组的虚拟析构函数失败