2015-04-06 123 views
0

嘿,我只是想弄清楚使用基类指针调用派生类的方法的概念,但后来我遇到了这个问题。使用基类指针调用函数?

#include <iostream> 

using namespace std; 

class A { 
    int a; 
public: 
    A() {} 
    A(int x) :a(x) {} 
    void show() { 
     cout<<"Hi this is base class ::\nvalue of a is "<<a<<endl; 
    } 
}; 

class B:public A { 
    int b; 
public: 
    B() {} 
    B(int x) : b(x) {} 
    void show() { 
     cout<<"Hi this is derived class::\n value of b is "<<b<<endl; 
    } 
}; 

int main() { 
    A a(20), *a_ptr; 
    B b(10), *b_ptr; 
    a_ptr = &b; 
    a.show(); 
    a_ptr->show(); 
    return 0; 
} 

a.show()输出:

Hi this is base class :: 
value of a is 20 

为接受,但 a_ptr->show()输出垃圾值

Hi this is base class :: 
value of a is -1121246592 

任何人都可以解释为什么发生这种情况..

+0

没有生气感到无助后,帮助你,而得到的投票! – Steephen

回答

0

简单你没” t初始化您的基类数据成员当你调用派生类的构造函数时,它显示垃圾值;因为它会调用基类的默认构造函数。

如果您更改您的基类默认构造函数如下,您将得到预期的结果。

A():a(10) {} 
3

这是因为,以具有多态性,你必须定义show()为虚函数,即class A

virtual void show(); 

由于这是不是这种情况在你的代码编译器将静态绑定呼叫a_ptr->show();class A执行show将打印未由class B构造函数初始化的成员a

+0

虚拟关键字用于标记这些方法,它们的行为可以被派生类覆盖。然后编译器会将这个调用转换为基类指针,以便通过类vtable来解析要调用的函数的正确版本。您可以在[cpprefernece](http://en.cppreference.com/w/cpp/language/virtual)中找到关于它的更多信息。 –

+0

这里的关键词是*多态*。首先理解这个概念。那么关键字'虚拟'将会更有意义。 – franji1

+0

@Steephen这里没有对象切片 – zmb