class — указатели на объект и потомков в переполнении стека

Я работаю над простым проектом 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 ()? Это ошибка во время выполнения?

0

Решение

Возможно иметь единственный указатель, который может указывать на объект
Тип 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
4

Другие решения


По вопросам рекламы [email protected]