在C++中,你可以使用虛擬方法有下面的代碼的工作,你希望:C++類鑄件替代虛擬方法
#include <iostream>
#include <string>
class BaseClass {
public:
virtual std::string class_name() const { return "Base Class"; }
};
class FirstClass : public BaseClass {
int value = 1;
public:
std::string class_name() const { return "FirstClass"; }
};
class SecondClass : public BaseClass {
long long value = -1;
public:
std::string class_name() const { return "SecondClass"; }
};
int main() {
const int array_size = 5;
const bool in_first_mode = true;
void *data;
int sample_size;
if (in_first_mode) {
data = new FirstClass[array_size];
sample_size = sizeof(FirstClass);
} else {
data = new SecondClass[array_size];
sample_size = sizeof(SecondClass);
}
// this is class-independent code
for (int index = 0; index < array_size; ++index) {
BaseClass *pointer = static_cast<BaseClass*>(data + index * sample_size);
std::cout << pointer->class_name() << std::endl;
}
return 0;
}
這將正常工作兩個in_first_mode = true
和in_first_mode = false
。 所以,基本上,當你想編寫適用於這兩個類的代碼時,你可以使用指向BaseClass的指針。
但如果你已經給定的數據緩衝區,充滿型TypeOne,TypeTwo,TypeThree或TypeFour的數據,並在運行時,你知道類型,它存儲在int type
。問題是TypeOne,TypeTwo,TypeThree和TypeFour沒有從一個基類繼承。在我的情況下,實際上,它們是來自第三方庫的結構,它是已編譯的C兼容庫,所以我無法對其進行修改。我想從上面的例子中得到類似pointer
的東西,但問題出現在確定C++類型應該具有這個pointer
。
它有一個更優雅型鑄造代替品把C++類包裝到這四種類型(其提供了一種類似於上面的例子中的東西),並涉及製造pointer
是void *
和
if (type == 1) {
TypeOne *type_one_pointer = static_cast<TypeOne*>(pointer);
// do something
} else if (type == 2) {
/* ... */
}
每必要性我用的時間是pointer
?
他們有不同的方法?如果沒有 - 您可以使用模板。如果是的話 - 你應該和不同的班級一起工作。 – ForEveR
將函數指針存儲在數組中,並使用'type'作爲索引。 – knivil
@ForEveR,我該如何使用模板? – Dmitry