2010-11-27 5 views
0

Поэтому предположим, у меня есть:Вызов член высшего класса уровня C++

Class A 
{ 
void A::DoSomething(); 
A::A() 
}; 

Class B : public A 
{ 
void B::DoSomething(); 
B::B() 
} 

Class C : public A 
{ 
void C::DoSomething(); 
C::C() 
} 

B obj1; 
C obj2; 

void RemoveObjectFromListOrSomethingSimiliar(A objToLookFor) 
{ 
//assuming you found the object, how would you call the top-level DoSomething() (for example B::DoSomething()) instead of the A::DoSomething()? 
} 

Я не уверен, если это имеет смысл

[EDIT] Ok, так что это своего рода работу. Хотя он по-прежнему перенаправляется на базовый метод, что меня смущает.

B obj1; 
c obj2; 
AList.push_back(obj1); 
AList.push_back(obj2); 

//later, in another method: 

A objInBack = AList.back(); 
objInBack.DoSomething(); 

AList.pop_back(); 

objInBack относится к А-уровне структуры класса, а затем вызывает тот уровень DoSomething(). Я изменил методы A на виртуальные, так есть ли способ явно определить уровень выполнения или?

ответ

4

Я не уверен, что правильно ответил на ваш вопрос, но я думаю, что вам нужно динамическое связывание.

Вот пример, основанный на вашем псевдокоде.

#include <iostream> 

class A 
{ 
    public: 
     A() {} 
     virtual void DoSomething() { std::cout << "A did something!" << std::endl; } 
}; 

class B : public A 
{ 
    public: 
     B() {} 
     void DoSomething() { std::cout << "B did something!" << std::endl; } 
}; 

class C : public A 
{ 
    public: 
     C() {} 
     void DoSomething() { std::cout << "C did something!" << std::endl; } 
}; 

void DoSomethingWithSomething(A* ptr) 
{ 
    ptr->DoSomething(); 
} 

int main() 
{ 
    A* obj1 = new A(); 
    A* obj2 = new B(); 
    A* obj3 = new C(); 
    B* obj4 = new B(); 
    C* obj5 = new C(); 

    DoSomethingWithSomething(obj1); 
    DoSomethingWithSomething(obj2); 
    DoSomethingWithSomething(obj3); 
    DoSomethingWithSomething(obj4); 
    DoSomethingWithSomething(obj5); 
} 

Выход бы тогда:

A did something! 
B did something! 
C did something! 
B did something! 
C did something! 
+0

Добавлено мой выбор так же, как вы отправили это. Я верю, что вы сделали именно то, что мне нужно. благодаря – Fuller 2010-11-27 20:03:20

3

Я бы объявил DoSomething виртуальным, и назовите его как objToLookFor.DoSomething().

Кстати, ваш RemoveObjectFromListOrSomethingSimiliar, возможно, должен принять A* в качестве параметра, а не только A.

Смежные вопросы