【问题标题】:Understanding Inheritance in C++ [duplicate]了解 C++ 中的继承 [重复]
【发布时间】:2014-05-16 07:57:50
【问题描述】:

我正在尝试学习 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"

【问题讨论】:

    标签: c++ inheritance


    【解决方案1】:

    你需要使display()方法virtual

    像这样:

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

    virtual 允许派生类“覆盖”基类的函数。

    【讨论】:

    • @andy.. 使其成为虚拟后,它的输出是“派生类基类”......但我只期待“派生类”
    • @someone:为什么不呢?你写的是cout &lt;&lt; name &lt;&lt; ", " &lt;&lt; Base::name &lt;&lt; endl; 而不是cout &lt;&lt; name &lt;&lt; endl
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        C++ 调度有点奇怪。除非您将显示方法声明为“虚拟”,否则 bptr->display 将始终调用基类的显示。

        更详细的解释是here

        【讨论】:

          【解决方案5】:

          多态性(一般使用指向派生类实例的基类指针)是通过分派到虚函数来完成的,如其他答案中所述。但是,如果您使用基类指针指向派生类,您将使用基类的数据成员,因为编译器不知道派生类的数据成员,调用基类的函数也是如此,所以基类display() 函数使用基类name 数据成员,结果是“基类”。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-08-06
            • 2016-05-19
            • 1970-01-01
            • 1970-01-01
            • 2020-04-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多