指针类型对象在inhertiance

时间:2017-08-09 03:52:01

标签: c++

在这段代码中,我将对象B的地址存储在A的指针类型对象中 如果我调用该函数,那么程序必须运行第二类函数但它不起作用并运行第一类函数 如果我在父类类函数之前放置虚拟,那么它将移向其他类函数 当我在指针类型对象中存储第二类地址时,程序必须显示第二类函数。但它无法做到这一点 为什么会这样?

#include<iostream>

using namespace std;
#include<conio.h>

class a
{
    public:
    void fun()
    {
       cout << "1st";
    }
};

class b:public a
{
    public:
    void fun()
    {
        cout << "2nd";
    }
};

class c :public a
{
    public:
    void fun()
    {
        cout << "3rd";
    }
};

void main()
{
    a *A;
    b B;
    c C;
    A = &B;
    A->fun();
    _getch();
}

3 个答案:

答案 0 :(得分:1)

  

当我在指针类型对象中存储第二类地址时,程序必须显示第二类函数...

不,它没有。在C ++中,函数与类(类型)相关联,而不是与对象相关联。因此编译器会查看调用函数的指针类型。然后,它尝试在相应的类定义中找到这样的函数。 在你的情况下,编译器看到&#34;通过类型A&#34的指针调用函数fun();它只是将其翻译为fun()的{​​{1}}地址。

*可调用函数存储在其他位置,但不存储在对象内部。

确实,这是&#34;静态类型&#34;语言:编译器通过对象类型的棱镜来查看对象。

但是,如上所述,如果要将函数与特定对象关联,则需要使用关键字class A。这将为A类的每个对象创建一个虚拟表(并且所有对象都从A继承)。然后标记为virtual的所有函数的地址将存储在此虚拟表中。因此,当继承类具有其自己的虚函数实现时,新实现的地址将virtual对象的虚拟表中的先前地址。

现在,当您通过override指针调用fun()时,控制流(现在在运行时)将查找对象虚拟表,并找到您期望的函数的地址

class A

答案 1 :(得分:0)

您需要使用virtual关键字,否则继承可能无法按预期工作。

请按以下方式更改class a

class a
{
public:
      virtual void fun()
{

答案 2 :(得分:0)

在c ++中,指针是静态的。这意味着他们总是在寻找父母的功能,即使他们指向子类。你可以通过声明:有趣的虚拟来避免这种情况。看看这个: http://www.cplusplus.com/doc/tutorial/polymorphism/