2014-06-06 102 views
0

一定派生類可以說,我已實現了以下類如何循環基礎對象是

class A 
{ 
    public: 
     virtual void printA() 
     { 
     cout << "Hi from A!" << endl; 
     } 
}; 

class B : public A 
{ 
    public: 
     virtual void printB() 
     { 
     cout << "Hi from B!" << endl; 
     } 
}; 

class C : public B 
{ 
    public: 
     void printC() 
     { 
     cout << "Hi from C!" << endl; 
     } 
}; 

讓我們也說我已經創建了一個std::vector<A *> vec包含來自A,B實例化的對象的隨機量,和C.現在讓我說我被迫迭代所有對象vec,但只調用具有printC()方法的對象(即C實例)。做這個的最好方式是什麼?

int main() 
{ 
    std::vector<A *> vec; 

    .... 
    // insert random objects from both A, B and C into vec 
    .... 

    for(vector<A *>::iterator x = vec.begin(); 
     x != vec.end(); 
     x++) 
    { 
     if(dynamic_cast<C *>(*x) != 0) // 1. is this OK? 
     (*x)->printC(); 
     else 
     (*x)->printA();    // 2. is this also OK? 

    } 
} 
  1. 是1 OK?如果是的話,這是最佳做法?

  2. 也會導致在C的情況下的問題2?

也許這些都是愚蠢的問題,但我對C++很新,以及C++中多態性的工作原理對我來說很奇怪。由於

+0

什麼是'我',我沒有看到它的定義。 – CoryKramer

+0

這不會編譯。因爲'printC()'不是'A'的成員函數。舉一個更好的例子 – 101010

+0

另外你必須使'print()'公開。 – 101010

回答

2

1是行不通的,因爲*x的類型爲A*A沒有一個printC成員。它應該是:

if (C * c = dynamic_cast<C *>(*x)) { 
    c->printC(); 
} 

2是好的,但與您的描述不符;你說你想「只調用具有printC()方法的對象」,而這會在其他對象上調用printA()

雖然這確實看起來很奇怪,你通常會定義一個虛擬函數,由每個類實現以爲該類做正確的事情,然後無條件地爲所有事情調用它。

3

我想你指的是以下

#include <iostream> 
#include <vector> 


int main() 
{ 
    class A 
    { 
    public: 
     virtual ~A() = default; 
     virtual void print() const 
     { 
      std::cout << "Hi from A!" << std::endl; 
     } 
    }; 

    class B : public A 
    { 
    public: 
     void print() const 
     { 
      std::cout << "Hi from B!" << std::endl; 
     } 
    }; 

    class C : public B 
    { 
    public: 
     void print() const 
     { 
      std::cout << "Hi from C!" << std::endl; 
     } 
    }; 

    std::vector<A *> v = { new A(), new B(), new C() }; 

    for (A *p : v) p->print(); 

    return 0; 
} 

輸出是

Hi from A! 
Hi from B! 
Hi from C!