理解C ++中的继承

时间:2014-04-04 06:43:15

标签: c++ inheritance

我正在尝试学习C ++,并编写了这段代码。根据我的理解,此代码需要生成输出"Derived Class",但输出为"Base Class"。 请帮我理解这一点。

#include <iostream> 
using namespace std; 

class Base { 
    public: 
    char* name; 
    void display() { 
         cout << name << endl; 
    } 

};

class Derived: public Base { 
   public: 
   char* name; 
   void display() { 
       cout << name << ", " << Base::name << endl; 
   } 
}; 

int main() { 
   Derived d; 
   d.name = "Derived Class"; 
   d.Base::name = "Base Class"; 

   Derived* dptr = &d; 

   Base* bptr = dptr; 

   bptr->display();
}

请将我视为初学者并解释其输出为"Base Class"

的原因

5 个答案:

答案 0 :(得分:2)

您需要制作display()方法virtual

像这样:

class Base{ 
    public: 
    char* name; 
    virtual void display() { 
         cout << name << endl; 
 } 

virtual允许派生类覆盖&#39;基类&#39;功能

答案 1 :(得分:0)

http://www.parashift.com/c++-faq/dyn-binding.html

  

静态解析非虚拟成员函数。那就是   成员函数是基于静态选择的(在编译时)   对象的指针(或引用)的类型。

     

相比之下,虚拟成员函数是动态解析的(at   运行)。也就是说,动态选择成员函数(at   运行时)基于对象的类型,而不是类型   指针/对该对象的引用。

答案 2 :(得分:0)

如果希望通过基类指针调用派生类函数,则需要使基类函数成为虚函数。将关键字virtual添加到函数中,您的代码就可以了。

答案 3 :(得分:0)

C ++调度有点奇怪。除非你声明显示方法&#39;虚拟&#39; bptr-&gt;显示将总是调用基类的显示。

更详细的解释是here

答案 4 :(得分:0)

多态性(通常与指向派生类实例的基类指针一起工作)通过调度到其他答案中解释的虚函数来完成。但是,如果指向具有基类指针的派生类,则将使用基类的数据成员,因为编译器不知道派生类的数据成员,并且同样适用于基类的调用函数,所以基类display()函数使用基类name数据成员,结果是“基类”。