Вызов члена класса верхнего уровня C ++ - PullRequest
0 голосов
/ 27 ноября 2010

Итак, предположим, у меня есть:

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()?
}

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

[ПРАВИТЬ] Хорошо, так что это вроде работает.Хотя он все еще перенаправляет на базовый метод, что меня смущает.

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 ссылается на A-уровень структуры класса и впоследствии вызывает этот уровень DoSomething ().Я изменил методы A на виртуальные, так есть ли способ явно определить уровень выполнения или?

Ответы [ 2 ]

4 голосов
/ 27 ноября 2010

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

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

#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!
3 голосов
/ 27 ноября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...