【问题标题】:polymorphism, virtual methods, C++多态性、虚方法、C++
【发布时间】:2015-01-22 11:31:54
【问题描述】:
class A;
{
private:
    int a;
public:
    virtual int getV() { return a; }
} a;

class C : public A;
{
private:
    int c;
public:
    int getV() { return c; }
} c;

class D
{
public:
   A* liste;
} d;

可以为 liste 分配内存,并且 A::a 和 C::c 保存值。现在,如果我将 c 放入 D::liste[0] 并用

cout << d.liste[0].getV();

它打印 A::a。尽管我将 A::getV() 声明为虚拟,为什么它不打印出 C::c?

【问题讨论】:

    标签: c++ polymorphism virtual member


    【解决方案1】:

    C++ 多态性仅适用于指针和引用。 liste[0] 的类型为A,而不是A*A&amp;,因此liste[0].getV() 调用不会被虚拟调度。它只是调用A::getV()

    【讨论】:

    • 谢谢!这个问题的最佳/常见解决方案是什么?
    • @LPrulzcrossover 如果你想要多态行为,你应该使用引用或指针。例如A* ptr = &amp;c; ptr-&gt;getV();将打印C::c
    • 对我来说 VS10 express 和 gcc 4.4.7,也为数组做多态性。表示:ptr[0].getv() 给出与ptr-&gt;getv() 相同的值。从问题中不清楚是什么问题。需要给出完整的无效代码,但我猜他试图从 A 对象到达 C...
    【解决方案2】:

    我这样写了程序,得到了预期的正确结果

    #include <iostream>
    using namespace std;
    
    class A
    {
     private:
        int a;
     public:
        virtual int getV() { cout<<"A";return a; }
    };
    
    class C : public A
    {
     private:
     int c;
     public:
       virtual int getV() { cout<<"C";return c; }
    };
    
    class D
    {
      public:
        A* liste[2];
    };
    
    int main()
    {
      D d;
      d.liste[0]=new C();
      d.liste[1]=new A();
      cout<<d.liste[0]->getV();      
      return 0;
    }
    

    看看就好..

    【讨论】:

    • 谢谢!在D 中,您也可以使用A** liste 来保持动态,不是吗?
    • 是的,我们可以做到这一点.. 但我只是说程序是如何工作的。
    猜你喜欢
    • 2022-11-19
    • 1970-01-01
    • 2016-02-20
    • 2021-11-25
    • 2010-11-17
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多