oop — доступ к методу подкласса из экземпляра родительского класса в переполнении стека

Моя команда и я работаем с C ++ (парадигма ООП). Мы должны реализовать DataType DtClassA и два производных класса DtClassB а также DtClassC,

Мы сделали это так:

// DtClassA.h
class DtClassA {
private:
int id;

public:
DtClassA();
int getId();
};

// DtClassA.cpp
DtClassA::DtClassA() {
this->id = 0;
}
int DtClassA::getId() {
return this->id;
}

// DtClassB.h
class DtClassB: public DtClassA {
private:
bool isAlive;

public:
DtClassB();
bool getIsAlive();
}

// DtClassB.cpp
DtClassB::DtClassB() : DtClassA() {
this->isAlive = true;
}
bool DtClassB::getIsAlive() {
return this->isAlive;
}

// DtClassC.h
class DtClassC: public DtClassA {
private:
char type;

public:
DtClassC();
char getType();
}

// DtClassC.cpp
DtClassC::DtClassC() : DtClassA() {
this->type = 'm';
}
char DtClassC::getType() {
return this->type;
}

// main.cpp
int main() {
DtClassB ctb = DtClassB();
createA(ctb);
}
createA(DtClassA& dta) {
cout << dta.getId() << endl; // We can do this.
cout << dta.getIsAlive();    // We cannot do this.
}

в main.cpp файл, который мы должны реализовать функцию createA(DtClassA& dta),

Эта функция может получить DtClassB или же DtClassC, но в этих двух случаях мы не можем получить доступ к методам, которые не объявлены в DtClassA,

Есть какой-то способ доступа к методу getIsAlive() внутри createA(DtClassA& dta) функционировать?

0

Решение

Нам удалось решить нашу проблему с dynamic_cast (спасибо PM100).

Вот код:

// DtClassA.h
class DtClassA {
private:
int id;

public:
DtClassA();

// To make a dynamic_cast, we needed to define "getId()" as virtual.
virtual int getId();
};

// DtClassA.cpp
DtClassA::DtClassA() {
this->id = 0;
}
int DtClassA::getId() {
return this->id;
}

// DtClassB.h
class DtClassB: public DtClassA {
private:
bool isAlive;

public:
DtClassB();
bool getIsAlive();
}

// DtClassB.cpp
DtClassB::DtClassB() : DtClassA() {
this->isAlive = true;
}
bool DtClassB::getIsAlive() {
return this->isAlive;
}

// DtClassC.h
class DtClassC: public DtClassA {
private:
char type;

public:
DtClassC();
char getType();
}

// DtClassC.cpp
DtClassC::DtClassC() : DtClassA() {
this->type = 'm';
}
char DtClassC::getType() {
return this->type;
}

// main.cpp
int main() {
DtClassB ctb = DtClassB();
createA(ctb);
}
createA(DtClassA& dta) {
cout << dta.getId() << endl; // We can do this.

try {
auto dtb = dynamic_cast<ClassB &>(dta);
} catch (std::bad_cast &e) {
cout << "Failed to cast DtClassA to DtClassB!" << endl;
}

try {
auto dtc = dynamic_cast<ClassC &>(dta);
} catch (std::bad_cast &e) {
cout << "Failed to cast DtClassA to DtClassC!" << endl;
}

// In "main()" function we call this function with an instance of
// DtClassB, so the first try-catch will pass and the second will
// not.
// So, now, we can do this:
cout << dta.getIsAlive();  // getIsAlive() is an operation from DtClassB.
}
0

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

Других решений пока нет …