Пониженная ссылка родительского класса на ссылку дочернего класса в функции-члене класса

0

У меня есть иерархия классов, как показано ниже:

class Base
{
    public:
    virtual Base& derived() const=0;
}

class Derived:public Base
{
    public:
    Derived& derived() const
    {
        return dynamic_cast<Derived&>(*this);
    }
    void test(){cout<<"Hi";}
}

Цель derived() - вернуть ссылку точного типа.

int main()
{
    Derived d;
    Base &b = d;
    (b.derived()).test();
    return 0;
}

Я получаю ошибку компиляции

can't find void test() in Base

Как я заметил, Derived::derived() действительно вызвал. Кажется, что Derived::derived() не возвращал ссылку на производный класс, как ожидалось.

  • 1
    Ваша Base и Derived имеют никакого отношения друг к другу.
  • 0
    Соори, это опечатка. Получено наследование от базы. @billz
Теги:
casting
reference

2 ответа

0

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

class Base
{
public:
    virtual void test() const { }
};

class Derived : public Base
{
public:
    void test() const {std::cout<<"Hi";}
};

void func(const Base& b) {
    b.test();
}

int main(int argc, const char * argv[])
{
    Derived d;
    const Base& b = d;
    b.test();
    func(b);
}
  • 0
    Это хорошее решение. Но что, если у меня есть три производных класса Derived1, Derived2, Derived3 и только у двух из них есть метод test (). Так что я не мог определить test () в базе? Мне все еще любопытно, почему мое решение не работает. b.derived () возвращает ссылку на производный объект, а (b.derived ()). test () должно быть в порядке.
  • 0
    Пока у Base есть метод test() , он будет работать. Что касается вашего решения, посмотрите на сигнатуру Base::derived() снова. Что это говорит, что возвращается? Он говорит, что возвращает Base& , а не Derived& .
Показать ещё 2 комментария
0

Вы только что забыли наследство в своей выборке? Что-то вроде этого будет работать, но это очень плохой дизайн.

class Base
{
public:
    virtual ~Base() { }
    template < typename T>
    const T& derived() const {
        return dynamic_cast<const T&>(*this);
    }
};

class Derived : public Base
{
public:
    void test() const {std::cout<<"Hi";}
};

int main(int argc, const char * argv[])
{
    Derived d;
    const Base& b = d;
    b.derived<Derived>().test();
}
  • 0
    Да, я забыл наследство в вопросе. Но Derived унаследован от Base в моем коде. Мое решение не сработало, и мне интересно, почему нет.
  • 0
    Ваше решение может сработать. Но я хочу использовать Base & в качестве параметра функции. Ваше решение должно сделать эту функцию шаблоном функции. Я пытаюсь избежать этого. Спасибо, в любом случае.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню