Я работаю над простым проектом C ++ (под Linux), в котором будут указатели на объекты. У меня есть класс A, класс B, который расширяет A, и класс C, который расширяет B. В классе C есть метод (тест), который не существует в A или B.
Возможно ли иметь единственный указатель ‘p’, который может указывать на объект типа A, B и C? Как бы я определить этот указатель?
Во-вторых, поскольку a.test () не существует, но c.test () существует, может ли мой общий указатель ‘p’ вызвать p-> test ()? Будет ли это компилироваться? Что если во время выполнения p указывает на объект класса A и я вызываю p-> test ()? Это ошибка во время выполнения?
Возможно иметь единственный указатель, который может указывать на объект
Тип A, B и C?
Я полагаю, вы имеете в виду «который может указывать либо на объект A, либо на объект B, либо на объект C», право?
Да, вы можете иметь такой указатель.
Как бы я определить этот указатель?
A*
Указатель базового класса может указывать на объекты производных классов.
Во-вторых, как бы я вызвал методы объекта, если указатель может
указать на классы A / B / C?
Вы определяете virtual
функция в A
и переопределить его в B
а также C
, Затем, когда вы вызываете метод через ваш A*
, язык будет выполнять динамическую диспетчеризацию, то есть он будет автоматически вызывать правильный метод в зависимости от того, A*
указывает на A
к B
или к C
,
Нужно ли приводить их перед вызовом методов?
Нет. Это в значительной степени победило бы назначение виртуальных функций.
Вот полный пример:
#include <iostream>
class A
{
public:
virtual ~A() {} // not really needed in this program,
// but almost always needed in real code
// when a class has a virtual function
virtual void method() { std::cout << "A::method\n"; }
};
class B : public A
{
public:
virtual void method() override { std::cout << "B::method\n"; }
};
class C : public A
{
public:
virtual void method() override { std::cout << "C::method\n"; }
};
int main()
{
A a;
B b;
C c;
A* ptr = &a;
ptr->method();
ptr = &b;
ptr->method();
ptr = &c;
ptr->method();
}
Выход:
A::method
B::method
C::method