【问题标题】:Overridden function applied to base class list应用于基类列表的覆盖函数
【发布时间】:2014-04-07 22:51:26
【问题描述】:

我只是想知道有没有办法做这样的事情:

Class A {}; //Base class

Class B : A {}; //B inherits from A

Class C : A {}; //C inherits from A

...
...
...

void func(B){do x;}
void func(C){do y;}
...
...
...
list<A> l //l contains Bs or Cs.

for each element in l {func(element);}

并获得每个人的预期行为?

【问题讨论】:

  • 你必须让A 有一个virtual 析构函数,并且你要覆盖的函数也是virtual;然后使用list&lt;A*&gt;,或者最好使用list&lt; shared_ptr&lt;A&gt; &gt;

标签: c++ inheritance overloading virtual


【解决方案1】:

您可以执行以下操作:

    class A // Base clss
    {
       public: // or protected, depends on your needs
         virtual void func() {};
    };

    class B : public A //B inherits from A
    {
       public: // or protected, depends on your needs
         void func() { do x };
    }; 

    class C : public A //C inherits from A
    {
       public: // or protected, depends on your needs
         void func() { do y };
    }; 

    ...
    ...
    ...

    list<A*> l //l contains Bs or Cs.

    for each element in l { element->func(); }

这样你使用多态而不是重载静态函数func。

【讨论】:

【解决方案2】:
#include <iostream>
#include <vector>

class A
{
public:
    virtual void func() {}
};

class B : public A
{
public:
    void func()
    {
        std::cout << "B prints x" << std::endl;
    }
};

class C : public A
{
public:
    void func()
    {
        std::cout << "C prints y" << std::endl;
    }
};

int main()
{
    std::vector<A*> v;
    v.push_back(new B());
    v.push_back(new C());
    for (std::vector<A*>::iterator it = v.begin(); it != v.end(); ++it){
        (*it)->func();
    }
    return 0;
}

输出:

B prints x
C prints y

【讨论】:

    【解决方案3】:

    您可以使用多态性。例如

    #include <iostream>
    #include <memory>
    #include <list>
    #include <algorithm>
    
    class A 
    {
    public:
       virtual ~A() {}
       virtual void do_it() = 0;  
    };
    
    class B : public A 
    {
    public:
       virtual void do_it() { std::cout << "processing of B\n"; };  
    
    };
    
    class C : public A 
    {
    public:
       virtual void do_it() { std::cout << "processing of C\n"; };  
    };
    
    void f( std::unique_ptr<A> &pa ) { pa->do_it(); }
    
    int main()
    {
        std::list<std::unique_ptr<A>> l;
        l.push_back( std::unique_ptr<A>( new B ) );
        l.push_back( std::unique_ptr<A>( new C ) );
    
        std::for_each( l.begin(), l.end(), f );
    } 
    

    【讨论】:

      猜你喜欢
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      • 2017-09-22
      • 2020-04-10
      相关资源
      最近更新 更多