#include <iostream>
#include "memory"
// base class
class base
{
public:
void setVal(int val)
{
m_val = val;
}
int getVal()
{
std::cout << "val = " <<m_val<<std::endl;
return m_val;
}
bool checkVal(int val)
{
return val>8?true : false;
}
private:
int m_val = 5;
};
// derived class
class derived1: public base
{
private:
};
// derived class
class derived2: public base
{
public:
bool checkd2Val()
{
checkVal(9);
}
private:
};
int main()
{
std::unique_ptr<base> d1;
d1 = std::make_unique<derived1>();
std::unique_ptr<base> d2;
d2 = std::make_unique<derived2>();
d2->checkd2Val(7);
return 0;
}
Компилятор выдает ошибку: No member named "checkd2Val" in base.
Мне интересно, как нам вызвать checkd2Val в этом случае? Спасибо!!
Вот вам тест: derived2 d3; d3.checkd2Value(42);. Это должно доказать, что производные классы могут получать доступ к методам, которых нет в базовом классе.





Ошибка правильная. Вы пытаетесь вызвать checkd2Val(), используя указатель base*, а checkd2Val() не существует в классе base.
Если вам действительно нужно вызвать checkd2Val() с помощью d2, вам нужно ввести его, например:
static_cast<derived2*>(d2.get())->checkd2Val(7);
Однако это все равно не удастся, поскольку derived2::checkd2Val() не принимает входной параметр, а main() передает значение.
Вместо этого вам следует объявить base::checkVal() как virtual и переопределить его derived2, например:
#include <iostream>
#include <memory>
// base class
class base
{
public:
void setVal(int val)
{
m_val = val;
}
int getVal()
{
std::cout << "val = " <<m_val<<std::endl;
return m_val;
}
virtual bool checkVal(int val)
{
return val > 8;
}
private:
int m_val = 5;
};
// derived class
class derived2: public base
{
public:
bool checkVal(int val) override
{
return base::checkVal(9);
}
};
int main()
{
std::unique_ptr<base> d2 = std::make_unique<derived2>();
d2->checkVal(7);
return 0;
}
Переменная
d2имеет типbase *. У классаbaseнет методаcheckd2Val(), поэтомуd2не может получить к нему доступ. Указатели на классbaseмогут иметь доступ только к общедоступным вещам в классеbase.