А *
#ifndef _A_H
#define _A_H
class A
{
public:
int x{ 0 };
A() {}
virtual ~A() {}
};
// definition
class B
: public A
{
public:
B() {}
~B() override {}
void foo(A* a);
};
// definition
class C
: public A
{
public:
C() {}
~C() override {}
void foo(A* a);
};
#endif _A_H
А. cpp
#include "A.h" // NECESSARY !
#include <iostream>
void
B::
foo(A* a)
{
C* c = dynamic_cast<C*>(a);
if (c)
{
std::cout <<
"c->x = "
<< c->x
<< std::endl;
}
}
void
C::
foo(A* a)
{
B* b = dynamic_cast<B*>(a);
if (b)
{
std::cout <<
"b->x = "
<< b->x
<< std::endl;
}
}
main. cpp
#include "A.h"
int main()
{
B b;
b.x = 1;
C c;
c.x = 2;
b.foo(&c);
c.foo(&b);
return 0;
}
Используйте следующую команду для компиляции и выполнения, если вы используете gcc
:
g++ -std=c++17 -I. -o main A.cpp main.cpp \
&& ./main
После запуска программы вы получите следующий вывод из приглашения:
c->x = 2
b->x = 1