наследование, вызов перегруженного метода из базового метода - PullRequest
0 голосов
/ 19 октября 2011

У меня есть два класса:

class A {
    int get();
    string str();
}

string A::str() {
    return string_with( get() );
}

class B : public A{
    int get();
}

, если я сделаю:

A a
B b
b.str()

b вызовет A::str() (хорошо), и он будет использовать метод A::get()плохой!).Я хочу, чтобы при вызове b.str() B::get() использовался str.

Как заставить это работать?

Ответы [ 3 ]

3 голосов
/ 19 октября 2011

Просто сделайте это виртуальным.Это именно то, для чего предназначен виртуальный.

Напишите

virtual int get();

в определении А.И, чтобы сделать код более понятным, сделайте то же самое с буквой B.

Кстати, я предполагаю, что вы хотели написать class B : public A.

2 голосов
/ 19 октября 2011

В волшебном слове объектно-ориентированного программирования есть два способа вызова метода: статический и динамический диспетчеризация.

В статической диспетчеризациикод, вызываемый, когда вы делаете что-то вроде a.do_it(), определяется статически, то есть определяется по типу переменной a.

. При динамической диспетчеризации вызываемый код определяется динамически, т. е. онопределяется типом объекта , на который ссылается a.

C ++, конечно, поддерживает и .Как вы сообщите компилятору, какой тип отправки вы хотите?Просто: по умолчанию у вас есть статическая диспетчеризация, если только вы не добавите virtual в объявление метода.

1 голос
/ 19 октября 2011

Вы можете использовать виртуальное ключевое слово.а затем используйте указатель

class A
{
public:
    virtual int get() { cout << "A::get()" << endl; return 0;}
    string str()
    {
        cout << "A::str()" << endl;
        get();
        return "";
    }
};

class B : public A
{
public:
    virtual int get() { cout << "B::get()" << endl; return 0; }
};

B * b = новый B;b-> str ();

вывод: A :: str () B :: get ()

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