Предположим, у меня есть два класса: A
и B
и B
- A
.Функциональная подпись и наследование в C++
Класс A:
class A
{
public:
virtual const unsigned char* getArray()
{
return array;
}
protected:
unsigned char array[250];
};
Класс B:
class B : public A
{
public:
virtual unsigned char* getArray()
{
return array;
}
};
Могу ли я создать класс C, который будет делать это?
class C
{
public:
const unsigned char* getArrayMiddle(A &a)
{
return (a.getArray() + 125);
}
unsigned char* getArrayMiddle(B &b)
{
return (b.getArray() + 125);
}
};
С помощью этого простого примера, я пытаюсь узнать, если я могу создать два метода в классе C
, один из них возвращается константный указатель, если требуется по типу объекта он получает.
Будет ли компилятор автоматически вызывать правильный метод в C
в зависимости от типа параметра, даже если B
получает A
?
Чтобы уточнить, если у меня есть
A* obj = new B();
C c;
c.getArrayMiddle(*obj);
, какая функция будет называться? Может ли это создать непредвиденные ситуации?
Вы можете очень легко поместить этот код в компилятор и проверить.Но довольно плохо, чтобы тот же метод был переопределен, не будучи виртуальным, а также изменял константу. –
Я действительно проверил и скомпилировал его. Я также задаю вопрос, чтобы убедиться, что такого рода вещи не требуют дополнительной меры предосторожности для использования или не могут заставить меня в беде в некоторых ситуациях. – rgaillard
У них разные подписи, поэтому это не проблема. Тем не менее, я бы не рекомендовал иметь одинаковые имена публичных методов при выводе класса без переопределения. –