Ich lerne C++. Ich habe eine Basisklasse, Base
, und seine abgeleitete Klasse, Derived
. Und sie sind push_back
in std::vector<Base*> vec
. Unter der Annahme vec[0] == &Base
und vec[1] == &Derived
kann ich die Funktion für und vec[1]
ohne virtuelle Funktion wechseln. Der Code ist am Ende dieser Frage. Gibt es einen besseren Weg, es ohne virtuelle Funktion zu machen? Ich möchte reine Datenklassen und ich möchte Nichtmitgliedsfunktionen hinzufügen, um sie zu modifizieren, um zu vermeiden, Code von Datenklassen zu ändern. Vielen Dank.Gibt es eine bessere Möglichkeit, die Funktion ohne virtuelle Funktion zu wechseln?
class TypeInterface {
public:
virtual int type(void) = 0;
virtual ~TypeInterface() {}
};
class Base : public TypeInterface {
public:
static constexpr int type_ = 1;
virtual int type(void) {
return type_;
}
virtual ~Base() {}
};
class Derived : public Base {
public:
static constexpr int type_ = 10;
virtual int type(void) {
return type_;
}
virtual ~Derived() {};
};
void Function(Base* ptr) {
std::cout << "function for Base" << std::endl;
}
void Function(Derived* ptr) {
std::cout << "function for Derived" << std::endl;
}
void SwitchFunction(int type, void* ptr) {
switch (type) {
case 1: {
Base* original_type_ptr = static_cast<Base*>(ptr);
Function(original_type_ptr);
break;
}
case 10: {
Derived* original_type_ptr = static_cast<Derived*>(ptr);
Function(original_type_ptr);
break;
}
default:
std::cout << "invalid type(=" << type << ")" << std::endl;
}
}
void test_function_selecter(void) {
Base b;
Derived d;
std::vector<Base*> vec;
vec.push_back(&b);
vec.push_back(&d);
for (auto e: vec) {
SwitchFunction(e->type(), e);
}
}
Ihr Code hat ein undefiniertes Verhalten. Das sind einige böse Würfe. Idealerweise sollten Sie, wenn Sie nur C++ lernen, überhaupt keine Zeiger oder Umwandlungen verwenden. –
Wie wäre es, die Funktion als Variable zu speichern? Sie können es statisch machen, wenn es für alle Instanzen verwendet wird. std :: function myFunc = [] (void) {// mach etwas} –
Striker
Danke, Kerrek SB. Ich habe versucht, herauszufinden, um was es sich bei Ihnen handelt, und ich nehme an, Sie befürchten vielleicht, dass ich eine falsche Kombination von Typ und Nichtigkeit verwenden kann *. In meinem Fall hat SwitchFunction (e-> type(), e) ein festes Format. Ich hoffe also, dass ich die falsche Kombination vermeiden kann. – mora