У меня есть иерархия классов, как показано ниже:
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()
не возвращал ссылку на производный класс, как ожидалось.
Стандартная ситуация переопределения. Я включил функцию, так как вы сказали, что хотите передать значение в качестве параметра.
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);
}
Base
есть метод test()
, он будет работать. Что касается вашего решения, посмотрите на сигнатуру Base::derived()
снова. Что это говорит, что возвращается? Он говорит, что возвращает Base&
, а не Derived&
.
Вы только что забыли наследство в своей выборке? Что-то вроде этого будет работать, но это очень плохой дизайн.
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();
}
Base
иDerived
имеют никакого отношения друг к другу.